Typescript: Kemampuan untuk menguasai TS dan mengabaikan kesalahan tertentu oleh pengembang

Dibuat pada 30 Jun 2016  ·  150Komentar  ·  Sumber: microsoft/TypeScript

Pengembang harus dapat menambahkan komentar di atas kesalahan ts seperti

/// TS_IGNORE
let a:string = 1

dan minta kompiler tidak melaporkan kesalahan itu ...
ada skenario tertentu yang paling diketahui pengembang dan ingin membungkam laporan kesalahan.

suka : apa saja

Salam

Sean

Fixed Suggestion

Komentar yang paling membantu

Keluarkan saja (pemeran bukan istilah resmi, tetapi konsep yang sama)

const foo: string = 7 as any;

Apakah itu yang Anda cari?

Semua 150 komentar

Sepakat. Merindukan sesuatu seperti Java @SuppressWarnings , khususnya untuk kasus yang dijelaskan di sini :

Pengikut:

const typeMetadataKey = Symbol('type');

function type(name: string): PropertyDescriptor {
 return Reflect.metadata(typeMetadataKey, name);
}

Menghasilkan kesalahan: Unable to resolve signature of class decorator when called as an expression. .

Ketika digunakan seperti di bawah ini:

class Person {
  @type('string')
  firstName: string;
}

Dekorator berfungsi seperti yang diharapkan dan akan dikompilasi tetapi memberikan kesalahan di atas.

Jika Anda memiliki pemikiran tentang bagaimana hal ini dapat diselesaikan dengan senang hati, galilah jika seseorang ingin menunjukkan arah yang benar.

Keluarkan saja (pemeran bukan istilah resmi, tetapi konsep yang sama)

const foo: string = 7 as any;

Apakah itu yang Anda cari?

Saya hanya memberi contoh, bukan kasus (saya tahu semua tentang casting), saya punya kasus lain seperti
super dipanggil setelah baris pertama konstruktor dan masalah lainnya ...

  • akan membuat transisi ke TS lebih mudah dari JS + kadang-kadang Anda mengubah lib dan mendapatkan banyak kesalahan dan Anda hanya ingin membersihkan semuanya seperti yang Anda ketahui sebagai pengembang karena alasannya...

ini adalah fitur penting

Jadi sesuatu seperti // tslint:disable ?
Bahkan memungkinkan Anda mengaktifkan/menonaktifkan pemeriksaan tertentu yang dilakukan tsc ?
_misalnya:_ const FooBar: string = 'rozzzly'; // tslint:disable-line camelcase

itu akan luar biasa...

Saya tidak tahu... Saya pikir itu mungkin di luar cakupan tsc . Itulah gunanya linter.

harus ada yang bisa "menutupnya" :)

Saya pikir ada kasus yang bisa diperdebatkan untuk menekan kesalahan/peringatan pada fitur "eksperimental", seperti dekorator, di mana API sedikit tidak stabil dan kesalahannya mungkin tidak selalu akurat. Anda mendapatkan versi (sangat spesifik) dari ini hanya dengan menggunakan bidang "experimentalDecorators" tsconfig, tetapi itu hanya menekan satu jenis peringatan.

Untuk memainkan pendukung iblis saya sendiri, ini dapat mendorong pengguna baru TypeScript untuk menekan peringatan yang tidak mereka pahami alih-alih mempelajari mengapa peringatan itu terjadi. Dan dengan fitur eksperimental, setiap orang adalah pengguna baru - memiliki kemampuan untuk menekan kesalahan dapat membuat pengguna puas dengan bug di fitur baru, alih-alih membuka masalah.

Pada akhirnya, saya masih ingin output Syntastic saya bersih. Yang berarti menekan kesalahan. Tentu saja, itu akan menjadi _setelah_ saya membuka masalah untuk kemungkinan bug dan mencoba mempelajari lebih lanjut. ;)

Masalah dengan "menutupnya" adalah Anda tidak tahu apa yang Anda dapatkan dari "itu". jadi let a:string = 1 a number atau string ?, bagaimana jika ada deklarasi lain dari a , apakah itu bergabung atau tidak? bagaimana jika seseorang menangkap jenis variabel ini misalnya return {a} ; , haruskah mereka ditetapkan ke { a : number } atau { a: string } , atau keduanya.

satu hal mendasar, kesalahan semuanya tercela. kesalahan tidak menghalangi generasi output, atau perkakas.

Ada mekanisme yang berbeda untuk memungkinkan Anda menekan pemeriksaan bagian tertentu dari kode Anda, misalnya any , jenis pernyataan (casts), dan deklarasi ambient.

jadi misalnya, jika Anda memiliki perpustakaan yang memiliki definisi "tidak valid", Anda bisa menghapusnya, dan menggantinya dengan declare module "blah" { export = any } . atau declare var $: any dan Anda siap melakukannya.

Karena saya biasanya membalas permintaan ini, saya pikir masalah Anda bukan dalam menekan kesalahan. masalah sebenarnya adalah Anda mendapatkan kesalahan yang menurut Anda tidak berguna. menekan yang tidak menyelesaikan masalah mendasar itu hanya menutupinya, dan memiliki konsekuensi dari keadaan yang tidak konsisten tanpa peringatan. Solusi yang tepat adalah dengan mengetahui error apa yang Anda dapatkan? perpustakaan apa itu? dan mengapa kompiler memberi Anda kesalahan yang tidak berguna ...

Dan untuk ini kita perlu tahu lebih banyak tentang use case Anda.

Kami telah melakukan beberapa pekerjaan di TS 2.0 untuk menyelesaikan beberapa masalah mendasar ini, misalnya;

gunakan saja apa saja, beginilah cara "tutup mulut", manfaat melakukannya (atau sebenarnya kekurangannya) adalah pertanyaan yang berbeda

let x: PieInTheSky = <any> 'cake is a lie';

ok tapi sekali lagi, masalahnya bukan pada casting

<any> memberi Anda javascript vanila dengan kebebasan 100% dari semua hal yang mengganggu dari TypeScript, jadi apa lagi yang Anda butuhkan?

dalam kasus saya, saya menyebut super bukan sebagai konstruktor baris pertama dan perlu menenangkan kesalahan

Alih-alih mencoba memaksanya untuk menerima antipattern, mengapa tidak menulis coba sesuatu seperti ini:

_ ClassA.ts _

class A {
    constructor() {
        this.init();
    }
    protected init() {
        // does nothing by itself
    }
}

_ ClassB.ts _

class B extends A {
    constructor() {
        super();
        console.log('rest of code from B\'s constructor');
    }
    protected init() {
        console.log('this runs before the rest of code from B\'s constructor');
    }
}

Inilah yang membuat TypeScript begitu mengagumkan, _dan juga menyebalkan_. Ini memaksa Anda untuk menulis kode yang lebih baik dan membuat Anda menjadi pengembang yang lebih baik. Mengubah proyek tidak menyenangkan ; Anda mungkin menganggapnya sebagai "inisiasi" pengembang atau mungkin, "percobaan dengan api". :laughing: Tapi Anda belajar banyak, dan itu sangat berharga.

dalam kasus saya, saya menyebut super bukan sebagai konstruktor baris pertama dan perlu menenangkan kesalahan

Dan buat kode Anda tidak kompatibel dengan ES6... Itulah mengapa tujuan utama TypeScript adalah untuk mengambil :gun: dari tangan Anda.

Jika TypeScript tidak menafsirkan sesuatu dengan benar, maka itu harus diperbaiki versus "dikerjakan". Sekarang ada beberapa hal di mana TypeScript bertindak lebih seperti linter dan belum ada konsep "kesalahan" versus "peringatan". Saya bisa melihat peringatan yang menekan ketika mereka datang. Hal-hal seperti kode setelah pengembalian dan parameter yang tidak digunakan harus menjadi peringatan menurut saya, karena secara sintaksis benar (meskipun bodoh).

inilah kasus lain di mana saya ingin memiliki fitur ini:

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

class Dog implements Animal {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

Saat ini ada kesalahan dari ts:

[ts] Kelas 'Anjing' salah mengimplementasikan antarmuka 'Hewan'
Properti 'numberOfLegs' tidak ada dalam tipe 'Anjing'

Seperti yang Anda lihat, kompiler benar-benar salah, tetapi saya tidak ingin (dan saya tidak boleh dipaksa) menyalin semua properti dari antarmuka hanya demi kompiler.

@DethAriel Pada dasarnya yang Anda minta adalah cara untuk mengekspresikan efek samping kondisi pos dalam sistem tipe. Itu menarik tetapi saya merasa itu akan mengarah pada beberapa kode yang sangat berbelit-belit.

@aluanhaddad Yup, saya benar-benar mengerti. Tapi tetap saja, saya tidak melihat solusi yang tidak jelek untuk itu kecuali untuk menyalin-menempelkan anggota antarmuka, yang setidaknya tidak ideal. Itu sebabnya saya berpikir bahwa memiliki kemampuan untuk menutup keluaran kesalahan kompiler masuk akal - kita semua adalah orang pintar di sini, dan kompiler harus mempercayai kita ketika kita menyuruhnya

Cukup gunakan antarmuka + kombo kelas

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

interface Dog extends Animal {
}

class Dog  {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

Thx, @mhegazy , itu memang berhasil

Bagaimana jika kesalahan tidak dapat dihilangkan <any> ?

Saya menggunakan sintaks ikatan eksperimental seperti yang dibahas di sini https://github.com/Microsoft/TypeScript/issues/3508 dan selain tidak menggunakannya, saya tidak dapat membuat kompiler mengabaikan kesalahan pada setiap baris sebelum setiap :: operator ( TS1128: Declaration or statement expected )

Saya menggunakan sintaks ikatan eksperimental

ini benar-benar lebih dari mengabaikan satu peringatan. Parser tidak mendukungnya, jadi pohon yang dihasilkan benar-benar salah, semua fitur kompiler mulai saat ini tidak akan berfungsi, jadi tidak ada inferensi jenis, tidak ada pemeriksaan kompatibilitas, tidak ada pemformatan, tidak ada penyelesaian, tidak ada apa-apa. jadi Anda akan lebih baik mengabaikan semua kesalahan, atau hanya bekerja di file .js.

Saat ini saya mengonversi proyek JS besar menjadi TypeScript dan setelah melakukan konversi ketika saya menjalankan perintah gulp build saya melihat sekitar 2000 kesalahan TS selama kompilasi dan sebagian besar kesalahan terkait dengan Properti tidak ditentukan pada kelas atau Modul tidak didefinisikan. Saya pikir pasti ada beberapa cara untuk menekan jenis kesalahan ini karena file JS keluaran dihasilkan.

Ini persis kasus saya juga, saya mengonversi aplikasi yang dibangun dengan desain modul-sebagai-properti pra-ES6, jadi saya memiliki objek global app.namespace1.namespace2.something.views.view -seperti BESAR.

Saya menulis ulang beberapa bagiannya dan saya mengandalkan objek app.* global dan sub-elemennya yang berbeda dalam kode saya. Yang saya dapatkan hanyalah peringatan "Tidak dapat menemukan 'aplikasi' namespace".

Saya telah memfaktorkan ulang semua dependensi global saya ke globalProxy.ts, jadi ini adalah satu-satunya tempat saya mendapatkan peringatan, tetapi akan AWESOME untuk menambahkan //TS-NO-WARNINGS di bagian atas file ini untuk membersihkan konsol dari pesan yang jelas...

Kesalahan TS tidak memblokir pembuatan kode. Anda dapat memilih untuk mengabaikannya, tetapi apa yang dikatakan ini adalah bahwa kompiler tidak dapat menyatakan kebenaran kode Anda.

@zeeshanjan82 mengapa tidak menggunakan --allowJs dan memigrasikan file demi file? Dengan pengaturan itu, Anda tidak akan mendapatkan kesalahan ketik dari sumber JavaScript. Anda juga dapat menggunakan deklarasi wildcard ambient untuk menekan kesalahan resolusi modul seperti
_globals.d.ts_

declare module '*';

Berikut ini kasus penggunaan lain untuk penekanan kesalahan.

Pengelola perpustakaan momen lupa menambahkan isoWeek sebagai string yang valid ke parameter enum untuk metode startOf dan endOf . Itu diperbaiki dalam rilis berikutnya, tetapi dengan melakukan itu mereka sepenuhnya memfaktorkan ulang cara unit-unit ini ditangani, yang akan menyebabkan terlalu banyak pekerjaan ulang di pihak kami.

Jadi kami memperbaiki versi momen di tempat, tetapi sekarang kami pada dasarnya tidak dapat menggunakan isoWeek karena kesalahan pelemparan TS. Jadi terjebak di antara batu dan tempat yang keras saat ini.

Anda bisa menambahkan salinan lokal. mengatakan sesuatu yang sederhana seperti:

// ./overrides/moment.d.ts
declare module "moment";
// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "baseUrl": ".",
        "paths": {
            "moment": ["overrides/moment.d.ts"]  // override definition for moment
        }
    }
}

sekarang kompiler akan memeriksa salinan lokal Anda dari override/moment.d.ts alih-alih yang datang dengan paket. jelas ini bisa berupa salinan lokal dari file deklarasi momen, atau beberapa hal yang Anda butuhkan.

Saya kekurangan waktu dan keinginan untuk mempertahankan definisi pengetikan saya sendiri untuk perpustakaan pihak ke-3;)

Saya kekurangan waktu dan keinginan untuk mempertahankan definisi pengetikan saya sendiri untuk perpustakaan pihak ke-3;)

Dan itu baik-baik saja. cukup gunakan declare module "moment"; yang setara dengan declare var $: any untuk modul, dan kompilator tidak akan mengganggu Anda lagi.

Saran @mhegazy sangat bagus. Ini akan membawa Anda sekitar 20 detik untuk melakukan itu. Omong-omong, sehubungan dengan momen, mereka lupa beberapa unit yang saya gunakan dan mereka sangat terbuka untuk menerima permintaan tarik saya.

Kelemahan dari menambahkan declare module "moment"; adalah Anda tidak akan lagi memiliki intellisense IDE atau tipe statis yang memeriksa kode terkait momen apa pun . Dan any s yang muncul cenderung mengalir keluar ke kode sekitarnya, mematikan banyak pemeriksaan statis di sana juga. Ini adalah harga yang mahal yang harus dibayar untuk menekan kesalahan yang terkait dengan satu nilai enum yang bermasalah.

@aluanhaddad ada permintaan tarik terbuka untuk memperbaiki masalah, tetapi ditutup demi yang lain, yang memperkenalkan perubahan yang melanggar (dan masih tidak menambahkan dukungan untuk isoWeek ), jadi tidak yakin apa yang terjadi di sana .

Intinya adalah bahwa masalah ini pasti akan muncul lebih sering di masa depan dengan adopsi Angular 2 dll. Jadi, saya bisa membayangkan cara untuk menekan kesalahan tertentu.

Saya memiliki masalah ini dengan pustaka inti simpul (bersih, simpul 6.9 LTS):

server = net.createServer({ pauseOnConnect: true }, function(connection) { ... }) 
// [ts] severity: 'Error'
message: 'Argument of type '{ pauseOnConnect: boolean; }' is not assignable to parameter of type '{ allowHalfOpen?: boolean; }'.
  Object literal may only specify known properties, and 'pauseOnConnect' does not exist in type '{ allowHalfOpen?: boolean; }'.'

Dan juga dengan perpustakaan ioredis:

var redis = new Redis(CONFIG.redis); 
// [ts] severity: 'Error'
message: 'Only a void function can be called with the 'new' keyword.'

Seperti yang ditunjukkan oleh @adamreisnz , ini adalah masalah umum karena file definisi tidak selalu diperbarui dengan benar. Selain itu, Jika Anda harus mengorbankan manfaat TS menggunakan declare module "x"; mengapa Anda menggunakan TS sejak awal?

Anda juga dapat menambah modul dengan jenis yang hilang agar tidak kehilangan kecerdasan.

Nah, ketika saya menulis:

if (typeof Symbol === "function" && Symbol.match) {
  // ...
}

Kompilator TypeScript selalu melaporkan kesalahan Cannot find name 'Symbol' jika target adalah es5 , meskipun kode ini memang bekerja dengan baik seperti yang saya harapkan.

Jadi saya setuju bahwa kami sangat membutuhkan arahan kontrol yang berfungsi di baris komentar.

declare var Symbol: any;

@gdh1995 @mhegazy Atau cukup gunakan perbaikan nyata yang mengatur flag lib ke es2015 .

@mhegazy Terima kasih. Saya menemukan ini berfungsi dengan baik:

declare var Symbol: {
  (description?: anyNotSymbol): symbol;
  readonly match: symbol;
};

@DanielRosenwasser Meskipun es2015 menambahkan fitur yang berguna ini, proyek saya terbatas untuk kompatibel dengan es5 dan kemudian Symbol harus dihindari di file lain.

Apa yang saya tidak mengerti sekarang adalah bahwa kompiler TypeScript memberi saya kesalahan bahkan ketika saya telah menulis typeof Symbol === "function" . Ada saran?

Satu kasus yang ingin saya tampilkan adalah untuk mengejek dependensi:

// Test.ts

// Component to test
import {ComponentToTest} from './ComponentToTest';

// Dependency of ComponentToTest to mock
import {Dependency} from './Dependency';

// Mock to replace it with
import {MockedDependency} from './MockedDependency';

Dependency = MockedDependency;

Kode ini memiliki efek yang diinginkan agar dependensi diejek di dalam komponen yang diuji tetapi TypeScript melontarkan "Tidak dapat menetapkan ke 'Ketergantungan' karena itu bukan variabel." kesalahan.

Saya yakin jawabannya adalah saya menggonggong pohon yang salah dan harus menggunakan sesuatu seperti inject-loader tetapi dari pengalaman saya solusi tersebut A) sulit untuk bekerja/tidak selalu kerja dan B) tidak sesederhana di atas. Seperti yang disebutkan OP, terkadang pengembang tahu yang terbaik. Saya tahu ini adalah solusi peretasan tetapi berhasil dan saya ingin TS diam saja dalam kasus ini.

Kode ini memiliki efek yang diinginkan agar dependensi diejek di dalam komponen yang diuji tetapi TypeScript melontarkan "Tidak dapat menetapkan ke 'Ketergantungan' karena itu bukan variabel." kesalahan.

ini adalah kesalahan di ES6. jadi beberapa waktu di masa depan ketika mesin mendukung modul ES6 secara asli, pengujian Anda perlu ditulis ulang.

Atau Anda dapat meminta ComponentToTest menerima argumen untuk Dependency , dan pengujian Anda dapat melewatinya, atau memiliki kait uji yang memungkinkan Anda mengganti nilai Dependency sebelum menjalankan metode pada ComponentToTest .

ini adalah kesalahan di ES6. jadi beberapa waktu di masa depan ketika mesin mendukung modul ES6 secara asli, pengujian Anda perlu ditulis ulang.

Ah cukup adil saya akan membatalkannya karena persyaratan itu bersinggungan dengan masalah ini.

Atau Anda dapat meminta ComponentToTest Anda menerima argumen untuk Ketergantungan, dan pengujian Anda dapat melewatinya...

Saya pikir ini adalah apa yang kita akhirnya pergi dengan. Cukup lumpuh harus mendefinisikan ulang api untuk suatu kelas agar dapat diuji, tetapi kemudian saya kira itu bukan masalah yang unik untuk TS sama sekali.

Terima kasih atas umpan baliknya, @mhegazy

Saya ingin mengganti centang pada jenis argumen suatu fungsi.

Kasus penggunaan saya cukup sederhana, saya memiliki fungsi seperti ini:

function isValidId(s: string): boolean {}

yang memeriksa apakah string mengikuti beberapa aturan.
Ini digunakan baik secara internal dan untuk memvalidasi input pengguna - Saya ingin menulis tes untuk melihat apakah itu mengembalikan false ketika pengguna memasukkan sesuatu yang bukan string.

Sebenarnya, fungsi dapat menerima apa pun sebagai input karena mampu mengelolanya, tetapi karena kami menggunakannya juga secara internal, saya ingin menentukan bahwa kami menginginkan string

Oleh karena itu, saya ingin sesuatu untuk menekan kesalahan tentang format yang salah dalam tes

@rpadovani cukup gunakan any :

expect(isValidId(78 as any)).toBe(false);

Saya bisa menggunakan ini juga. Kami memiliki situasi di mana foo(bar: any, baz: any) didefinisikan sebagai bagian dari kerangka kerja, tetapi dalam beberapa implementasi foo, bar tidak digunakan. Dengan pemeriksaan kesalahan TypeScript diaktifkan, ini menimbulkan kesalahan karena variabel yang tidak digunakan dideklarasikan. Harus dinyatakan, karena versi lain dari foo, bar digunakan.

@benjaminabbitt Tampaknya foo (_bar: any, baz: any) bekerja untuk Anda: nama yang dimulai dengan "_" tidak dipaksa untuk digunakan.

Tambahkan: Saya percaya bahwa kemampuan untuk mengesampingkan/mengabaikan kesalahan khusus itu penting.

Sesuatu yang menantang di sini adalah bahwa orang-orang terus muncul mengatakan bahwa ingin menekan kesalahan, memposting cuplikan kode, dan mendapatkan solusi dalam kode yang efektif untuk membungkam kesalahan tersebut (atau mencari tahu kode mereka benar-benar memiliki masalah). Sulit untuk merancang fitur ini tanpa mengetahui seperti apa kesalahan yang benar-benar bermasalah, atau memahami kesalahan mana yang ingin ditekan orang secara global.

Apa cara yang tepat untuk menangani kode javascript pihak ketiga yang ingin kami sertakan dalam proyek kami?

Pertimbangkan skenario berikut. Ada perpustakaan besar yang belum dipublikasikan ke npm dan bahkan jika itu, menggunakan perpustakaan apa adanya akan membuat aplikasi kita membawa banyak kode mati (goyangan pohon tidak dapat membantu karena mereka melampirkan semuanya ke objek).

Mari kita anggap bahwa dalam hal ini tidak layak mengekstraksi potongan kode ini dan menerbitkannya di npm. Apa pilihan lain yang kita miliki?

Dalam upaya saya untuk menggunakan perpustakaan ini, saya telah mengekstrak kode yang dibutuhkan proyek saya dan memasukkannya ke dalam proyek sebagai file TypeScript. Masalah dengan ini adalah bahwa TypeScript memeriksa file ini dan sekarang memberikan banyak kesalahan untuk file ini.

Untuk situasi ini, akan sangat bagus untuk memiliki /* ts:disable */ komentar di atas sehingga TypeScript akan tahu bahwa kami tidak peduli dengan kemungkinan kesalahan dalam file.

Harap dicatat bahwa proyek saya tidak lagi mengkomit file javascript apa pun dan meskipun demikian, proses pembuatannya akan menjadi lebih rumit saat mencoba mengakomodasi javascript ke dalam alur.

Adakah yang punya saran tentang cara menangani kode javascript pihak ketiga yang perlu di-host di proyek TypeScript?

Adakah yang punya saran tentang cara menangani kode JavaScript pihak ketiga yang perlu di-host dalam proyek TypeScript?

jangan migrasi mereka. biarkan file .js apa adanya. buat file .d.ts untuk mereka sebagai gantinya. ini adalah file .d.ts untuk cara apa pun.

file .d.ts dapat dimulai dengan sesuatu yang mendasar seperti:

declare var $: any;

kemudian tambahkan sesuai keinginan Anda, dan saat kebutuhan Anda bertambah.

Itu adalah pilihan yang baik jika saya melakukan file js. Apakah ada opsi lain untuk proyek yang mengabaikan file js?

Itu adalah pilihan yang baik jika saya melakukan file js. Apakah ada opsi lain untuk proyek yang mengabaikan file js?

Saya tidak yakin saya mengerti pertanyaannya. File JS diabaikan secara default. jadi Anda memilih untuk menambahkan file. sekali lagi rekomendasi saya adalah, untuk kode eksternal yang bukan milik Anda, atau untuk kode lama yang tidak ingin Anda ubah, jangan repot-repot mengubahnya menjadi TS. mulai dengan menulis file .d.ts untuk mereka. untuk ini, mulai sederhana, dengan any 's kemudian tambahkan saat Anda pergi.

Saya seharusnya mengatakan bahwa file js tidak dikomit ke repositori git, jadi alasan untuk meletakkan kode dalam file ts. Bagaimanapun, saya akan mencoba mengikuti rute yang Anda sebutkan dan memaksa komit file js itu.

Anda tidak perlu mengkomit file .js. katakanlah Anda menggunakan ketergantungan katakanlah bereaksi. biasanya Anda tidak akan melakukan react-0.12.0.js di repo Anda, tetapi Anda ingin menggunakannya. biasanya Anda akan memasukkan ini dalam tag skrip dari CDN misalnya. misalkan juga @types/react tidak ada, atau Anda tidak ingin menggunakannya. jadi di proyek Anda tambahkan file deklarasi baru sebut saja declarations.d.ts dan tambahkan:

declare module "react"; // just saying the module is of type any

ini memberi tahu kompiler bahwa ada modul yang disebut "bereaksi" dan itu hanya akan menggunakannya, tidak perlu menyertakan file .js apa pun.

Jadi jika saya ingin menggunakan sepotong kecil javascript (yang tidak tersedia melalui npm/CDN) dan saya memutuskan untuk mengkomitnya ke basis kode saya, saya memiliki 2 opsi:

Opsi 1 : Simpan kode asli sebagai file .js dan pertahankan file .d.ts untuk menangani tipe.

Saya pikir ini tidak berfungsi untuk @jmlopez-rod karena dia tidak ingin mengkomit kode javascript ke reponya, dan bahkan jika dia melakukannya, dia mengatakan itu akan membuat proses pembuatannya menjadi rumit.

Opsi 2 : Bungkus javascript dalam TypeScript dan atasi semua kesalahan TypeScript.

Ini mengatasi "proses pembuatan yang rumit" karena ini akan memperlakukan kode seperti TypeScript... tapi sekarang kami mendapatkan kesalahan TypeScript, dan kami telah kembali ke diskusi awal di utas masalah ini. Apakah ini kasus penggunaan yang valid untuk dapat menonaktifkan kesalahan TypeScript?

Saya pikir ini tidak berfungsi untuk @jmlopez-rod karena dia tidak ingin mengkomit kode javascript ke reponya, dan bahkan jika dia melakukannya, dia mengatakan itu akan membuat proses pembuatannya menjadi rumit.

tidak yakin saya mengerti mengapa itu mempersulit proses pembuatan Anda. Anda memiliki file "library.js" dan "website.js" , Anda memutuskan untuk memindahkan "website.js" ke "website.ts", panggil saja tsc website.ts --outFile website.js dan sekarang kita kembali ke tempat itu semua dimulai dengan dua file .js. jadi jangan lihat mengapa ini lebih rumit dari sebelumnya.. itu hanya langkah membangun tambahan di kepala rantai.

Ini mengatasi "proses pembuatan yang rumit" karena ini akan memperlakukan kode seperti TypeScript... tapi sekarang kami mendapatkan kesalahan TypeScript, dan kami telah kembali ke diskusi awal di utas masalah ini. Apakah ini kasus penggunaan yang valid untuk dapat menonaktifkan kesalahan TypeScript?

Saya tidak yakin saya sepenuhnya mengerti mengapa Anda memutuskan untuk mengganti file ini ke ts, dan mengintegrasikannya dengan proyek Anda, membiarkan jenis darinya mengalir ke komponen Anda yang lain, membangunnya bersama dengan kode Anda, namun mempertahankannya dengan standar yang berbeda.

Semoga menjadi contoh akan berguna di sini. seperti yang dicatat oleh @RyanCavanaugh , bagi saya tampaknya semua masalah ini memiliki cara yang jelas untuk memberi tahu kompiler tentang jenis dan menghindari kesalahan alih-alih menonaktifkan kesalahan bersama-sama dan membuang bayi dengan air mandi.

saya tidak mengerti mengapa deklarasi ambien ini tidak berfungsi untuk saya.
saya sudah mendefinisikan definisi jalur ke tsconfig.json seperti ini
"paths": { "js-xlsx": ["./xlsx.d.ts"] }
tapi tetap saja saya menemukan modul itu tidak ditemukan kesalahan.
Saya mencoba menambahkan 'fs', 'fs-extra' dan perpustakaan 'js-xlsx' semuanya tidak menanggapi deklarasi ambient saya, casting atau menambahkan jenis apa pun seperti di sini declare var $: any;
@mhegazy

Anda tidak perlu mengkomit file .js. katakanlah Anda menggunakan ketergantungan katakanlah bereaksi. biasanya Anda tidak akan melakukan react-0.12.0.js di repo Anda, tetapi Anda ingin menggunakannya. biasanya Anda akan memasukkan ini dalam tag skrip dari CDN misalnya. katakanlah @types/react juga tidak ada, atau Anda tidak ingin menggunakannya. jadi di proyek Anda tambahkan file deklarasi baru sebut saja deklarasi.d.ts dan tambahkan:

mendeklarasikan modul "bereaksi"; // hanya mengatakan modul bertipe apa saja
ini memberi tahu kompiler bahwa ada modul yang disebut "bereaksi" dan itu hanya akan menggunakannya, tidak perlu menyertakan file .js apa pun.

Omong-omong saya tahu bahwa perpustakaan fs-extra memiliki definisi tipe seperti @types/fs-extra dan untuk js-xlsx kami memiliki perpustakaan ts-xlsx tetapi ini sangat aneh sehingga trik ini tidak berfungsi untuk saya :(

Omong-omong saya tahu bahwa perpustakaan fs-extra memiliki definisi tipe seperti @types/fs-extra dan untuk js-xlsx kami memiliki perpustakaan ts-xlsx tetapi ini sangat aneh sehingga trik ini tidak berfungsi untuk saya :(

Saya pikir ada sesuatu yang lain terjadi dengan proyek Anda.

c:\test\9448>npm install @types/fs-extra
[email protected] c:\test\9448
`-- @types/[email protected]
  `-- @types/[email protected]

npm WARN [email protected] No description
npm WARN [email protected] No repository field.

c:\test\9448>type a.ts
import { rmdir } from "fs-extra";
rmdir("c:/test");

c:\test\9448>type tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5"
    }
}
c:\test\9448>tsc --v
Version 2.2.0

c:\test\9448>tsc

c:\test\9448>echo %ERRORLEVEL%
0

ya mungkin tetapi, masalah utama yang tidak dapat saya pahami adalah mengapa saya tidak dapat menekan peringatan kompiler dengan metode yang diberikan. Omong-omong saya punya https://github.com/AngularClass/angular2-webpack-starter , basis untuk proyek saya

Menekan kesalahan tidak selalu berarti memperkenalkan anti-pola.

Saya mendapatkan kesalahan yang salah,

error TS1005: '{' expected.

di BEJ yang sangat bagus ini:

<motor-node ref      = 'menu'
    absoluteSize     = `0, ${this.MENU_BAR_HEIGHT}, 0`
    >
    {menu}
</motor-node>,

Ia mengeluh bahwa string template membutuhkan { . Ini idealnya harus diperbaiki, tetapi sampai saat itu, saya ingin dapat menekan kesalahan untuk alasan yang baik .

@trusktr , kesalahan ini adalah kesalahan parse. menekannya tidak mengubah fakta bahwa kompiler tidak memahami kode sejak saat ini, dan bentuk file lainnya dalam keadaan tidak terdefinisi. itu berarti bahwa meskipun kesalahan ini diredam, jenis yang disimpulkan, serta kesalahan lain yang dihasilkan dalam file ini atau lainnya tidak benar.

Yang mengatakan. Menurut spesifikasi BEJ :

JSXAttributeValue :

" JSXDoubleStringCharactersopt "
'JSXSingleStringCharactersopt'
{ Ekspresi Tugas }
Elemen BEJ

Jadi saya khawatir kesalahannya benar dan atribut JSX tidak dapat memiliki literal templat string. anda dapat menggunakan absolteSize = {...} sebagai gantinya

kesalahan ini adalah kesalahan penguraian

Ya, makanya harus diperbaiki.

Outputnya adalah absoluteSize: "0, " + this.MENU_BAR_HEIGHT + ", 0" , yang memberi tahu saya bahwa kompiler baik-baik saja.

Oh. Maaf kalau begitu. Saya rindu memahami komentar Anda. Saya pikir Anda ingin kesalahan dibungkam.

Saya melakukannya, tetapi Anda benar, mungkin saya lebih baik hidup hanya dengan menambahkan {} .

Di TS 2.1 (VS2017 RC) kami mendapatkan peringatan yang dilaporkan berasal dari perpustakaan file JS (duduk di /Script) folder -seperti TS7027. Akan menyenangkan untuk dapat menekan peringatan/kesalahan dari file perpustakaan atau setidaknya untuk mendukungnya dalam beberapa jenis file penekanan global (mirip dengan C# GlobalSupressions.cs)

Di TS 2.1 (VS2017 RC) kami mendapatkan peringatan yang dilaporkan berasal dari perpustakaan file JS (duduk di /Script) folder -seperti TS7027.

Untuk kode yang tidak dapat dijangkau (TS 7027), setel --allowUnreachableCode atau setel di tsconfig.json .

Tetapi apakah mungkin untuk menerapkannya hanya pada file perpustakaan. Karena untuk "kode saya" saya membutuhkannya!

dengan menggunakan --alowJs itu menjadi kode Anda. kompilator akan menyedotnya, akan mengubahnya ke target yang disarankan, akan menggabungkannya jika Anda menggunakan --outFile .. hanya saja ia memiliki ekstensi .js. jika itu adalah kode "perpustakaan", saya akan merekomendasikan membuat .d.ts untuk itu dan memasukkan ini sebagai gantinya.

Saya tidak menyadari bahwa kami telah mengaktifkan --allowJs - di VS2015 proyek yang sama persis tidak mencoret jquery.js, file react.js berada di Script (dan sebenarnya hanya direferensikan dari halaman html oleh

let { value } = browser.waitForPromise(() => {
    return browser.executeAsync(function (method, name, resolve) {
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {
            resolve(result);
        });
    }, method, name);
});

Dalam kasus saya, baris pertama ditulis dalam TypeScript, baris kedua ditulis dalam JavaScript. Mereka dieksekusi dalam konteks yang berbeda dan saya tidak ingin mengubah kode JavaScript.
Jadi, kita membutuhkan opsi baru seperti /* ts-disable */ /* ts-enable */ (seperti eslint)

Dalam kasus saya, baris pertama ditulis dalam TypeScript, baris kedua ditulis dalam JavaScript. Mereka dieksekusi dalam konteks yang berbeda dan saya tidak ingin mengubah kode JavaScript.

tidak yakin saya mengerti apa yang Anda maksud dengan "baris kedua yang ditulis dalam JavaScript"? apakah Anda meneruskan seluruh pernyataan ke kompiler atau tidak?

tidak yakin saya mengerti apa yang Anda maksud dengan "baris kedua yang ditulis dalam JavaScript"? apakah Anda meneruskan seluruh pernyataan ke kompiler atau tidak?

Saya tidak ingin mengubah kode itu karena harus diteruskan ke server Selenium apa adanya .

Saya tidak ingin mengubah kode itu karena harus diteruskan ke server Selenium apa adanya.

jika ini dalam file .ts, itu akan diubah oleh kompiler. Kompiler menghapus anotasi tipe untuk Anda..

Terlepas dari itu, untuk sampel ini, yang Anda butuhkan hanyalah declare var browser: any; dan Anda seharusnya tidak mendapatkan kesalahan apa pun. lihat Taman Bermain untuk sampel.

jika ini dalam file .ts, itu akan diubah oleh kompiler. Kompiler menghapus anotasi tipe untuk Anda..

Saya memerlukan jaminan bahwa kode yang diberikan telah dieksekusi tanpa gangguan di IE6 dan browser lama lainnya.
Misalnya, Node.js mengikuti sistem modul CommonJS, tetapi require adalah fungsi khusus yang ditentukan oleh pengembang lain di halamannya. Itu sebabnya saya ingin memasukkan kode itu tanpa modifikasi pasca dan pra. Ini penting bagi saya dan tim saya.

Terlepas dari itu, untuk contoh ini, yang Anda butuhkan hanyalah mendeklarasikan var browser: any; dan Anda seharusnya tidak mendapatkan kesalahan. lihat Taman Bermain untuk sampel.

Sebenarnya, objek browser adalah objek paling populer di proyek saya dan tidak ada alasan untuk mengabaikannya. Metode browser.execute memiliki deklarasi tipe sendiri juga.

sekarang saya tidak yakin saya mengerti apa masalahnya. apa kesalahan yang Anda dapatkan?

Kode saya dieksekusi dalam konteks yang berbeda: node dan browser. Masalah saat ini untuk konteks kedua adalah anotasi tipe dan modifikasi kode.

img-2017-03-07-02-10-28

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
            function (method, name, resolve) { // browser
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
            resolve(result);  // browser
        });  // browser
    }, method, name); 
});

Berikut ini adalah implementasi sederhana dari metode browser.executeAsync :

browser.executeAsync  = (...args) => {
   let script = args.shift();

   RPC.Selenium('/session/:sessionId/execute', {
         script: `return (${script}).apply(null, arguments)`, 
         args
    });
}

Seperti yang Anda lihat, saya menggunakan TypeScript untuk pengujian Integrasi.

Apa pesan kesalahannya?

Kesalahan standar:

TS2345: Argument of type 'string[]' is not assignable to parameter string
TS7006: Parameter 'error' implicitly has an 'any' type
TS7006: Parameter 'attach' implicitly has an 'any' type
TS7006: Parameter 'message' implicitly has an 'any' type
TS7006: Parameter 'model' implicitly has an 'any' type

Dan seterusnya...

Definisikan require dengan benar.

declare function require(v: string[]): any;

Definisikan kebutuhan dengan benar.

aku tidak bisa. Dalam kasus saya, metode executeAsync berisi kode untuk proyek pihak ketiga dan ada variasi yang berbeda untuk require . Kode di atas hanyalah salah satu fungsi dari ratusan.
Keinginan saya sangat sederhana — izinkan saya mengecualikan beberapa kode saat saya membutuhkannya :)

anda dapat menempatkan declare function require(v: string[]): any; secara lokal. misalnya:

// module a.ts
export var ...

declare function require(v: string[], callback: Function);

let { value } = browser.waitForPromise(() => { 
    return browser.executeAsync( 
        function (method, name, resolve) { // browser
            require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // OK
                resolve(result);  
            });  
        }, method, name);
});

anda juga dapat melakukan cast ke any bila diperlukan:

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
        function (method, name, resolve) { // browser
            (<any>require)(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
                resolve(result);  // browser
            });  // browser
        }, method, name);
});

Ini harus menghasilkan kode yang identik.

Dalam kasus saya, saya memiliki kelas abstrak pribadi (tidak diekspor) yang hanya dimaksudkan untuk diperpanjang oleh dua kelas:

abstract class IParent {
  static fromConfig(config: ParentConfig): IParent {
    // actual code is 20 lines long, not this simple
    // this throws "Cannot create an instance of the abstract class 'Parent'"
    return new this().applyConfiguration(config);
  }
  abstract method1(): void;
  ...
}

export class FirstChild extends IParent {
  specificMethodForFirstChild() { ... }
  method1() { ... }
  ...
}

export class SecondChild extends IParent {
  specificMethodForSecondChild();
  method1() { ... }
  ...
}

Penggunaan:

let first = FirstChild.fromConfig({ ... });
let second = SecondChild.fromConfig({ ... });

// this runs successfully:
(first as FirstChild).specificMethodForFirstChild();
(second as SecondChild).specificMethodForSecondChild();

Tetapi pada metode fromConfig() saya mendapatkan "Tidak dapat membuat turunan dari kelas abstrak 'Induk':

Kode taman bermain

  • Saya dapat menduplikasi metode statis dan membuatnya memanggil fungsi umum tetapi terdengar sangat bodoh ketika saya sudah memiliki kode yang berfungsi.
  • Saya tidak dapat membuat kelas tidak abstrak karena subkelas menerapkan implementasi metode.
  • Saya dapat menghapus metode abstrak tetapi saya menggunakannya untuk menegakkan antarmuka yang sama pada subkelas.
  • Saya dapat menggunakan antarmuka yang terpisah untuk menerapkannya tetapi kemudian superclass tidak akan cocok dengan antarmuka dan itu adalah tipe yang dikembalikan oleh metode statis.
  • Saya tidak punya niat untuk memanggil metode statis pada kelas abstrak, saya hanya ingin itu membuat instance kelas yang berbeda pada subkelas yang berbeda

Kompiler tidak memaksakan bahwa konstruktor kelas turunan memiliki tanda tangan yang sama dengan basis. dengan kata lain konstruktor kelas turunan dapat memiliki lebih banyak argumen yang diperlukan daripada basis. menggunakan new this() membuat asumsi bahwa semua konstruktor turunan tidak memiliki parameter yang diperlukan; dan itu adalah sesuatu yang tidak dapat diverifikasi.

Jika Anda yakin ini benar, pertimbangkan casting sebagai new (<any>this)(x, y);

Poin bagus saya tidak melihat itu. Saran Anda benar-benar berhasil, saya akan mempertimbangkan bahayanya, terima kasih.

Apakah ada cara untuk membungkam Module ... was resolved to ..., but '--allowJs' is not set ? dalam kasus penggunaan saya, ada sistem build yang menanganinya dan saya tidak perlu meneruskan semua kode saya melalui TSC, jadi saya ingin membungkam kesalahan itu.

'deklarasikan modul "someModule";' di salah satu file .d.ts Anda.

Atau instal paket @types yang cocok jika ada.

Saya punya contoh lain kapan ini akan berguna:

const Button = (
  content: contentTypes,
  action: React.EventHandler<React.MouseEvent<HTMLDivElement>>,
  disabled: boolean
): JSX.Element => (
  <div className={`Button disabled-${disabled}`} onTouchStart='' onClick={ !disabled ? action : undefined } >
    { content }
    <div className='background'></div>
  </div>
);

Ini menimbulkan kesalahan karena onTouchStart tidak menerima string sebagai parameter yang benar. Namun, onTouchStart='' memperbaiki perilaku css yang rusak pada perangkat sentuh yang terkait dengan aturan css tertentu. Saya tidak ingin menonaktifkan kesalahan ini secara global atau mendefinisikan kembali beberapa jenis BEJ. Saya hanya ingin di baris ini untuk menghapus kesalahan ini.

onTouchStart={<any>''}

Itu sebenarnya tidak memperbaikinya.
Saya mendapatkan kesalahan ini:
error
Ini rusak di bawah sintaks tsx

onTouchStart={'' as any} , bukan (lupa JSX menggunakan sintaks pernyataan alternatif)

@RyanCavanaugh akankah kode yang dihasilkan memenuhi syarat sebagai kasus penggunaan yang sah untuk fitur ini? Saya menggunakan codegen angkuh untuk membuat klien api untuk layanan simpul. Saya juga menggunakan tipe klien yang dihasilkan di server saya, karena ini mengubah definisi angkuh menjadi antarmuka TypeScript, jadi ini adalah cara termudah untuk memastikan saya menghormati kontrak angkuh saya sendiri.

Kode yang dihasilkan agak aneh, dan memiliki blok seperti ini:

let contentTypeHeader: Dictionary<string>;
if (contentTypeHeader) {
    fetchOptions.headers = contentTypeHeader;
}

Ini memberikan kesalahan jika strictNullChecks aktif, jadi saya telah mematikan tanda untuk seluruh proyek. Yang menyebalkan. Saya tidak ingin menguraikan TypeScript yang dihasilkan dan memodifikasinya, tetapi saya akan siap untuk memasukkan sesuatu seperti <tsc strictNullChecks=false /> di bagian atas file (mirip dengan saran @alexanderbird ).

Bukankah ini akan menjadi permintaan perubahan ke pembuat kode angkuh untuk menghasilkan kode yang sesuai dengan strictNullChecks?

@mhegazy yakin - tapi ini hanya salah satu contoh dari sesuatu seperti ini. Ada banyak cara pembuatan kode berguna dalam TypeScript (lebih daripada di JavaScript). Jadi idealnya akan ada cara untuk tidak memaksa orang menyeret proyek mereka sendiri ke standar kode yang dihasilkan.

Tapi mereka :) kode yang Anda dapatkan dari alat pembuatan otomatis Anda menghasilkan jenis yang mengalir ke kompilasi Anda. jika alat pembuat kode mengabaikan --strictNullChecks maka kode Anda mengamati jenis yang tidak menyesatkan.
menonaktifkan pemeriksaan hanya meredam alarm kebakaran. masalahnya bukan alarm, itu yang menyebabkan kebakaran di tempat pertama.

@mhegazy Saya

Bagaimana dengan contoh yang kurang kontroversial - bagaimana jika kode yang dihasilkan memiliki lokal yang tidak digunakan? Itu tidak membahayakan kode saya - kecuali dalam kasus di mana saya harus mematikan noUnusedLocals di tsconfig - itulah yang saya lakukan sekarang.

Bagaimana dengan contoh yang kurang kontroversial - bagaimana jika kode yang dihasilkan memiliki lokal yang tidak digunakan? Itu tidak membahayakan kode saya - kecuali dalam kasus di mana saya harus mematikan noUnusedLocals di tsconfig - itulah yang saya lakukan sekarang.

jika Anda tidak peduli dengan kode yang dihasilkan, maka kode tersebut harus dalam .js dengan pendamping .d.ts. dengan cara ini Anda dapat memeriksanya, tetapi tidak perlu mengompilasinya.

kompiler TypeScript sepertinya tidak menyukai mixin garis bawah.js yang digunakan dengan rantai.

_.mixin(){sortFunciton: sortFunc(), otherChainFunc: otherFunction()}

....

someVal = _.chain(someArray)
.sortFungsi()
.OtherChainFunc()
.nilai();

...

Contoh yang cukup mudah adalah ketika Anda membuat pendengar untuk klik, misalnya dengan @HostListener() untuk Angular, seperti:

@HostListener('click', ['$event'])
onClick(event: MouseEvent) {
    // Code here...
}

Jika saya mengaktifkan noUnusedLocals , saya memiliki kesalahan berikut:

ERROR in ./src (20,13): 'onClick' is declared but never used.

Adakah cara saya bisa membiarkan kompiler mengabaikannya?

@JeremyCarlsten

_.mixin(){sortFunciton: sortFunc(), otherChainFunc: otherFunction()}

sepertinya kode tidak valid.

@leocaseiro Mengapa harus pribadi? Dalam hal ini onClick adalah metode yang akhirnya akan digunakan oleh angular. Masalah serupa selalu terjadi ketika kita mendeklarasikan variabel privat yang kita gunakan dalam sebuah template. Jika Anda menggunakannya dalam template, cukup buat variabel menjadi publik. Masuk akal karena Anda membiarkan sudut menggunakannya.

Hai @jmlopez-rod, Anda benar.

Menarik bahwa sebagai publik, itu lewat sekarang! Saya sangat menghargai bantuan Anda.

@leocaseiro public adalah tingkat visibilitas default sehingga Anda tidak perlu menentukannya.

Mohon maaf sebelumnya jika terdengar negatif – saya mungkin melewatkan sesuatu (baru di TS).
Contoh lain (Saya hanya menggunakan TS untuk menghasilkan ES5 - tidak ada casting, deklarasi, interfacing)

// do-as-i-tell-you-start
const factory = () => {
  const _this = [];
  let _value;
  Object.defineProperties(_this, {

    // Error: Property 'getset' does not exist on type 'any[]'.
    // true at at creation but not when used – don't MOM me!
    'method1': { value(){ return _this.getset; } },   

    // Works with property strings – I don't want this
    'method2': { value(){ return _this['getset']; } }, 

    'getset': { get(){ return _value; }, set(value){ _value = value } },
  });
  return _this;
}

benar saat dibuat tetapi tidak saat digunakan – jangan IBU saya!

Itulah yang secara khusus dirancang untuk dilakukan oleh TypeScript. Jika Anda tidak ingin menggunakan tipe dan casting, mengapa Anda menggunakan TypeScript? Seperti yang ditunjukkan beberapa kali di utas ini, itu masih akan memancarkan kode, jadi Anda sudah mengabaikan kesalahan dengan risiko Anda sendiri. Mengapa mencoba membodohi TypeScript, untuk tujuan apa?

Mengapa mencoba membodohi TypeScript, untuk tujuan apa?

Ini tentang memindahkan tim dari ES5 => ES6 (Babel atau TS) => TS dengan segala kejayaannya – dalam langkah kecil.

Kesan saya adalah bahwa TS adalah tambahan untuk JS yang memungkinkan Anda untuk melangkah di level apa Anda berada.
Alasan keluhan saya adalah contoh dummy yang diberikan melempar Kesalahan dan karenanya _does
tidak menghasilkan ES5_. IMO melewati linting seharusnya tidak wajib untuk transpile.

Kecuali Anda tidak memiliki kesalahan emisi, itu akan memancarkan. Jadi itu menghasilkan ES5.

Tidak – beralih ke Babel – berhasil

tsc dapat dikonfigurasi untuk mengeluarkan output terlepas dari kesalahan jenis, lihat opsi noEmitOnError .

Jika Anda menggunakan ts-loader, ia juga memiliki opsi transpileOnly mana ia hanya akan berubah dan tidak menampilkan kesalahan apa pun.

@trusktr terima kasih - saya akan mencobanya :-)

kesalahan tidak menghalangi pembuatan output, atau perkakas

Itu tidak benar. Kami memiliki pengaturan (cukup umum - ini berasal dari starter) di webpack yang dalam build produksi lumpuh dan TIDAK menghasilkan apa pun. Dan seharusnya seperti itu - kompiler melaporkan kesalahan, programmer kembali dan memperbaikinya. Mengapa menggunakan tipe ketika seluruh tim mengabaikannya karena build "berfungsi"? Demikian pula jika tsc gagal dikompilasi maka penyegaran otomatis tidak berfungsi (plugin sengaja ditulis seperti itu - tidak menyegarkan jika kode Anda salah [atau dianggap salah oleh kompiler]).

Menekan kesalahan berguna ketika ada bug di tsc. Misalnya ini harus dikompilasi:

interface A {
  isEmpty(x: any[] | string | object): boolean;
}

const a: A = <A>{};
a.isEmpty({a: 1});

tetapi dalam rilis TS saat ini gagal.

Sunting: panggilan fungsi tetap (salin saluran yang salah)

Oleh

a.isEmptyObject({a: 1});

maksud Anda

a.isEmpty({a: 1});

?

Oh ya. Salin baris yang salah :/.

Menekan kesalahan berguna ketika ada bug di tsc.

Bug yang mencegah emisi harus diperbaiki. Sangat tidak mungkin kemampuan untuk mengabaikan kesalahan akan menyebabkan tsc tiba-tiba mengeluarkan sesuatu ketika memiliki bug yang membuatnya macet.

Saya memiliki impor yang terlihat seperti ini:

import * as reducers from "./**/reducer.ts"

Saya menggunakan TypeScript terlebih dahulu, lalu Babel. Saya memiliki plugin babel yang memperlakukan * dalam impor sebagai pola glob. TypeScript melempar kesalahan yang mengeluh tentang .ts , dan kemudian jika .ts dihapus, ia tidak dapat menemukan modul.

Saya tidak begitu yakin bagaimana menyelesaikan ini, tetapi pikiran pertama saya adalah menekan kesalahan yang terkait dengan baris ini. Saya mencoba melakukan pemetaan modul di konfigurasi, tetapi * diperlakukan sebagai wildcard di sana juga dan tidak dapat diloloskan.

@lukescott dalam .d.ts dalam lingkup kompiler:

declare module './**/reducer' {
  export = {
    [reducer: string]: () => void; /* or whatever */
  };
}

Contoh lain tentang bagaimana ini akan berguna:

const req = https.request({
        host: 'www.google.com',
        method:'GET',
        path:'/',
        port: 443,
}, (res) => { 
    console.log(res.connection.getPeerCertificate());
});

getPeerCertificate mengatakan itu tidak ada karena definisi yang salah di node https ( juga this ).

Itu masih mengkompilasi dan bekerja dengan garis bawah merah besar, tetapi akan sangat menyenangkan untuk dilakukan

console.log(res.connection.getPeerCertificate()); //ts:disable-line

@trusktr
Ups sepertinya saya mengacaukan sintaks yang mengubahnya dari kode prod. Berikut ini adalah js plunk dari apa yang saya coba gambarkan. Mungkin lebih merupakan masalah dengan definisi garis bawah. Tetapi jika perpustakaan pihak ketiga menyebabkan masalah dengan kompiler ts, tidakkah kita dapat mengabaikan baris kode itu?

+1. Ini akan berguna untuk pengujian, karena saya perlu memastikan kode saya menimbulkan kesalahan ketika dilewatkan dalam sesuatu yang tidak diharapkan.

Fitur yang berguna ini hanya akan menjadi generalisasi dari ! untuk objek yang mungkin nol.

Jika saya ingin membawa file perpustakaan ke dalam sebuah proyek (misalnya Chartjs), saya sering menyimpannya sebagai file TS (saya suka menyimpan semua file sumber sebagai TS dan dikompilasi sebagai JS) dan mengimpornya dengan ref tiga garis miring ke dalam TS file yang membutuhkannya. Namun, TypeScript kemudian mengeluh tanpa henti tentang kesalahan dalam file itu (tentu saja karena ini hanyalah file JS standar yang disimpan sebagai TS).

Namun, kemampuan untuk menambahkan:

/*ts-errors-disable*/ ke awal file perpustakaan dan /*ts-errors-enable*/ di akhir akan mengurangi output kesalahan yang tidak relevan tetapi masih memungkinkan pengembang untuk menyimpan semua file sumber sebagai TS.

Atau haruskah saya melakukan hal-hal yang secara fundamental berbeda?

@benfrain Nah, akan lebih baik untuk menginstal file definisi TypeScript yang sesuai jika ada ( npm install --save-dev @types/mylibrary ) atau untuk membuat file _.d.ts_ Anda sendiri dengan tipe any ke namespace perpustakaan Anda /kelas utama pertama:

// mylibrary.d.ts
declare module "mylibrary" {
    let mylibrary: any;
    export = mylibrary;
}
// main.ts
import mylibrary = require("mylibrary");
...

Saya punya pertanyaan. Pertama kode, dan kesalahan yang disorot TypeScript:

import {Directive, ElementRef, Input, OnChanges, SimpleChange} from '@angular/core'

@Directive({
  selector: '[blankAttr]',
})
export class BlankAttr implements OnChanges {
  @Input('blankAttr') private attrName: string // <--- TS Error: unused variable

  constructor(private el: ElementRef) {}

  public ngOnChanges(changes: {[key: string]: SimpleChange}): void {
    const change: any = changes.attrName 
    const prevValue: any = change.previousValue

    if (prevValue) {
      this.el.nativeElement.removeAttribute(prevValue)
    }
    this.el.nativeElement.setAttribute(change.currentValue, '')
  }
}

Masalah yang saya miliki adalah saya harus mendeklarasikan dekorator @Input untuk memungkinkan atribut dilewatkan string. Tapi saya hanya peduli dengan nilai string itu ketika berubah. Dan saya bisa mendapatkan nilai sebelumnya dan saat ini saat menangani acara perubahan.

Bisakah kita memiliki // ts-ignore sekarang? Atau adakah cara lain untuk menyelesaikan ini dengan baik?

@uglow mengapa attrName pribadi? Ini adalah variabel yang dimodifikasi Angular sehingga Anda bisa mendapatkan nilai dengannya. Oleh karena itu, perlu dipublikasikan.

@jmlopez-rod Saya telah mengubahnya menjadi publik, tetapi itu tidak mengubah masalah. TS mengatakan bahwa itu adalah variabel yang tidak digunakan.

Saya menggunakan TS 2.4.1, setelah menjadikannya publik TypeScript berhenti memancarkan kesalahan.

Sebelum:
screen shot 2017-07-26 at 9 53 13 am

Setelah:
screen shot 2017-07-26 at 9 53 39 am

Saya menggunakan 2.3.3. Saya akan mencoba 2.4.1. Terima kasih

Ini harus disertakan. Saya bekerja dengan mesin js khusus yang memungkinkan satu file .js mengembalikan nilai. Lihat Intisari saya untuk contoh . Saya menggunakan TS untuk menghasilkan file .js saya dan tentu saja TS tidak tahu tentang itu dan melempar:

A 'return' statement can only be used within a function body.

@mhegazy Saya mengalami masalah seperti ini dalam beberapa cara berbeda.

Situasi saya saat ini (seluruh aliran mengasumsikan mode deklarasi):

  • dekorator kelas memerlukan deklarasi kelas (bukan ekspresi kelas) dan saya berada di dalam suatu fungsi - pada prinsipnya ini dapat diperbaiki, tetapi tidak hari ini.
  • ok, tidak masalah saya akan membuat ekspresi deklarasi
  • tidak ada dadu, deklarasi sekarang memiliki nama yang tidak digunakan
  • ok, tidak masalah saya akan mengembalikannya
  • tidak ada dadu, Return type of public method from exported class has or is using private name
  • ... ?

Pada dasarnya, akar masalahnya di sini adalah bahwa ekspresi tidak dapat didekorasi, tetapi tidak masuk akal bagi Anda untuk meninggalkan semuanya untuk mengimplementasikan fungsi tersebut. Sementara itu, masuk akal bagi saya untuk hanya menekan kesalahan ini. Saya akan baik-baik saja jika menekan kesalahan mengharuskan saya untuk menemukan masalah TypeScript terkait dan mengatakan sesuatu seperti // TS-LIMITATION:#9448 meskipun saya menduga itu akan menghasilkan sejumlah besar masalah baru yang tidak berguna dari sudut pandang Anda.

Saya bahkan akan baik-baik saja jika Anda menambahkan penekanan khusus yang ditargetkan untuk masalah yang diketahui yang belum siap Anda tangani, tetapi hanya jika itu dilakukan dengan cepat dan tanpa terlalu banyak upaya desain (itu akan membuat mekanisme tidak ada gunanya :wink: )

Saya tidak ingin mendapatkan kesalahan kode yang tidak dapat dijangkau (di mana saya senang untuk membubuhi keterangan "tutup mulut pada kesalahan kode yang tidak dapat dijangkau di sini") ketika saya melakukan sesuatu seperti
if (false){ ...complicated debug code that I dont want to delete/forget... }

Jadi, kompiler TypeScript masih kehilangan opsi untuk "diam dan tidak mengacaukan alat lain". Akan sangat berguna bagi kami untuk memiliki opsi ini melalui komentar dan melalui sakelar kompiler untuk file tertentu atau bahkan glob. Kami terjebak dalam menggunakan alat versi lama karena kami tidak ingin kehilangan muat ulang otomatis (versi yang lebih baru tidak memuat ulang otomatis saat ada kesalahan). Jadi kami mematikan opsi buggy noImplicitAny (yang saya benar-benar tidak mau, saya menggunakan TypeScript karena typechecking dan dengan implisit yang diizinkan, TypeScript tidak membawa sebanyak itu ke tabel) atau tetap menggunakan paket versi kuno. Ya, saya melaporkan bug di keduanya, pemuat WebPack dan AwesomeTypeScript , tetapi tidak ada yang peduli. Masalah ini diabaikan selama berbulan-bulan sekarang. Saya melihatnya persis sama dengan paket TypeScript :-(.

@polyglotinc if (!!false) {

@RyanCavanaugh Nah, dalam hal ini, (!true) berfungsi ... Saya bahkan tidak menganggap itu sebagai kemungkinan karena saya _(sebagai mantan penulis kompiler)_ memberi kompiler lebih banyak kredit sehubungan dengan konstanta/literal ekspresi runtuh... Saya kira saya pikir jika itu akan menjadi tubuh yang sibuk tentang if (false) , itu akan tahu if (!true) adalah hal yang sama!

@unional pertanyaan SO dapat ditulis sedikit lebih jelas dan mungkin itu sebabnya kami membutuhkan kompiler untuk memberi tahu kami tentang kemungkinan kesalahan. Lihat tangkapan layar ini yang menunjukkan kesalahan yang ingin ditekan pengguna

screen shot 2017-08-09 at 12 43 20 am

Perhatikan bahwa di tangkapan layar saya hanya memiliki satu kesalahan. Itu karena saya sudah memperbaiki satu masalah yang ditangkap oleh kompiler.

private keyHandlers = {
    'ArrowDown': function ($event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

Pengguna mengklaim bahwa handleArrow* sedang digunakan tetapi TypeScript tidak melihatnya sedang digunakan. Sejauh menyangkut TypeScript this di this.handleArrowDown($event); dapat berupa objek apa pun yang memiliki metode handleArrowDown . Dengan fungsi panah ia sekarang mengetahui bahwa this adalah turunan dari kelas dan dengan demikian ia melihat handleArrowUp sedang digunakan.

Opsi lain: Gunakan parameter pertama palsu this .

  private keyHandlers = {
    'ArrowDown': function (this: SomeComponent, $event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

@jmlopez-rod Terima kasih. Ini adalah alternatif yang baik. Saya terutama menyukai solusi function(this: SomeComponent, ...) {...} karena itu yang paling fleksibel.

Fungsi panah tidak berfungsi jika keyHandlers bukan bagian dari kelas:

const keyHandlers = {
  'ArrowDown': function (this: SomeComponent, $event) {
    this.handleArrowDown($event); // error on accessing private method, filing an issue for it.
  },

  'ArrowUp': ($event) => { // doesn't work, duh
    this.handleArrowUp($event);
  }
}

export class SomeComponent {
  onKeyDown($event) {
    if (typeof keyHandlers[$event.code] === 'function') {
      keyHandlers[$event.code]($event);
    }
  }
  private handleArrowDown(_event) {
    // ...
  }

  private handleArrowUp(_event) {
    // ...
  }
}

Di sisi lain, fungsi panah adalah yang paling lurus ke depan dalam konteks ini.

Saya mencoba mengatur window.console secara manual untuk IE9 untuk mencegah kesalahan pada penggunaan console.log :

if (!window.console)
    window.console = {};

Tapi saya mendapatkan error TS2540: Cannot assign to 'console' because it is a constant or a read-only property. Apakah ada solusi untuk kasus penggunaan ini?

@amiraliakbari Anda dapat menegaskan window sebagai tipe any , yang secara efektif memungkinkan Anda memilih keluar dari pemeriksaan tipe:

(window as any).console = {};

ini berhasil bagi saya untuk menimpa/menonaktifkan console.log secara global -- Perhatikan bahwa Project.logging didefinisikan sebelum ini

(window.console as any).___real_log = window.console.log;
window.console.log = function(args) {
  if (Project.logging) return (window.console as any).___real_log(args);
  return;
};

Ini juga jauh lebih bersih daripada meletakkan pernyataan if seluruh kode saya karena saya hanya dapat menggunakan console.log seperti biasa

Seperti yang disebutkan di #19109, kami masih tidak memiliki kemampuan untuk menekan kesalahan tertentu .

Seperti yang disebutkan di #19109, kami masih tidak memiliki kemampuan untuk menekan kesalahan tertentu.

Saya pikir skenario dasar yang diuraikan dalam masalah ini telah diatasi. kita dapat membuat masalah baru untuk melacak penekanan kesalahan global menggunakan nomor kesalahan. Kami enggan menggunakan kode kesalahan sedemikian rupa karena kurang ekspresif.

Dibuat #19139.

Instruksi ini hanya berfungsi per file, bukan? Apakah mungkin membuatnya berfungsi di atas folder?

Instruksi seharusnya bekerja untuk satu baris pada satu waktu. Jika Anda melihat banyak kesalahan kompiler dalam proyek Anda, Anda dapat memeriksa bahwa Anda seharusnya memiliki opsi kompiler yang kurang ketat, seperti membiarkan noImplicitAny off (yaitu, variabel secara implisit any jika tidak beranotasi). Anda juga dapat membiarkan beberapa file sebagai JS dan mengaktifkan allowJs tetapi menonaktifkan checkJs .

Mengapa Anda menutup masalah ini? Solusinya masih hilang! Mengapa Anda melakukan diskusi yang tidak berarti selama 2 tahun alih-alih integrasi kemungkinan-penekanan kesalahan yang tepat?

@webia1 Anda mungkin tertarik dengan #19139 yang masih buka.

(Menambahkan komentar ini di sini karena mungkin berguna bagi mereka yang menemukan masalah ini, seperti yang saya lakukan)

Saya menemukan https://github.com/Microsoft/TypeScript/pull/21602 dan itu mungkin solusinya.

Cukup tambahkan // @ts-ignore ke kode Anda (atau bahkan // @ts-ignore <some code error> untuk mengabaikan hanya kesalahan yang ditentukan) .

Diuji di sini dengan TypeScript 2.7.2 dan berhasil!

(atau bahkan // @ts-ignoreuntuk mengabaikan hanya kesalahan yang ditentukan).

21602 tidak digabung. Anda tidak dapat mengabaikan hanya kesalahan tertentu.

@RyanCavanaugh Anda benar! Saya telah memperbarui komentar saya. Terima kasih!

Tiba di sini mencari untuk menekan kesalahan TS2339.

document.getElementById('theme-admin').disabled = false; /* tslint:disable */
document.getElementById('theme-member').disabled = true; /* tslint:disable */
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

siddjain picture siddjain  ·  3Komentar

zhuravlikjb picture zhuravlikjb  ·  3Komentar

MartynasZilinskas picture MartynasZilinskas  ·  3Komentar

bgrieder picture bgrieder  ·  3Komentar

kyasbal-1994 picture kyasbal-1994  ·  3Komentar