Mengumumkan TypeScript 3.3 RC

Hari ini dengan senang hati kami mengumumkan ketersediaan kandidat rilis kami (RC) dari TypeScript 3.3. Harapan kami adalah untuk mengumpulkan umpan balik dan masalah awal untuk memastikan rilis akhir kami mudah untuk diambil dan digunakan segera.

Asli di blog

Untuk mulai menggunakan RC, Anda bisa mendapatkannya melalui NuGet , atau menggunakan npm dengan perintah berikut:


npm install -g typescript@rc 

Anda juga dapat memperoleh dukungan editor dengan



TypeScript 3.3 harus menjadi rilis yang lancar untuk diadopsi, dan tidak mengandung perubahan yang melanggar. Mari menjelajahi apa yang baru dalam 3.3.


Perilaku yang ditingkatkan untuk memanggil tipe-tipe serikat pekerja


Ketika TypeScript memiliki tipe serikat A | B A | B , ini memungkinkan Anda untuk mengakses semua properti yang umum untuk A dan B (yaitu persimpangan anggota).


 interface A { aProp: string; commonProp: string; } interface B { bProp: number; commonProp: number } type Union = A | B; declare let x: Union; x.aProp; // error - 'B' doesn't have the property 'aProp' x.bProp; // error - 'A' doesn't have the property 'bProp' x.commonProp; // okay! Both 'A' and 'B' have a property named `commonProp`. 

Perilaku ini seharusnya terasa intuitif - Anda hanya bisa mendapatkan properti dari jenis serikat jika diketahui ada di setiap jenis serikat.


Bagaimana, alih-alih mengakses properti, kita berurusan dengan tipe panggilan? Nah, ketika setiap jenis memiliki tepat satu tanda tangan dengan parameter yang identik, semuanya berjalan baik dan Anda dapat memanggil jenis ini.


 type CallableA = (x: boolean) => string; type CallableB = (x: boolean) => number; type CallableUnion = CallableA | CallableB; declare let f: CallableUnion; let x = f(true); // Okay! Returns a 'string | number'. 

Namun, pembatasan ini terkadang, yah, terlalu ketat.


 type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number; // eats and ranks the fruit type ColorConsumer = (color: Color) => string; // consumes and describes the colors declare let f: FruitEater | ColorConsumer; // Cannot invoke an expression whose type lacks a call signature. // Type 'FruitEater | ColorConsumer' has no compatible call signatures.ts(2349) f("orange"); 

Contoh konyol dan pesan kesalahan yang buruk, baik FruitEater s dan ColorConsumer s harus dapat mengambil string "orange" , dan mengembalikan number atau string .


Di TypeScript 3.3, ini bukan lagi sebuah kesalahan.


 type Fruit = "apple" | "orange"; type Color = "red" | "orange"; type FruitEater = (fruit: Fruit) => number; // eats and ranks the fruit type ColorConsumer = (color: Color) => string; // consumes and describes the colors declare let f: FruitEater | ColorConsumer; f("orange"); // It works! Returns a 'number | string'. f("apple"); // error - Argument of type '"apple"' is not assignable to parameter of type '"orange"'. f("red"); // error - Argument of type '"red"' is not assignable to parameter of type '"orange"'. 

Dalam TypeScript 3.3, parameter dari tanda tangan ini berpotongan bersama untuk membuat tanda tangan baru. Pada contoh di atas, parameter fruit dan color berpotongan menjadi parameter baru tipe Fruit & Color . Fruit & Color benar-benar sama dengan ("apple" | "orange") & ("red" | "orange") yang setara dengan ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") ("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange") . Masing-masing persimpangan mustahil menguap, dan kita pergi dengan "orange" & "orange" yang hanya "orange" .


Masih ada beberapa batasan. Perilaku baru ini hanya dimulai ketika paling banyak satu jenis di serikat memiliki banyak kelebihan, dan paling banyak satu jenis di serikat memiliki tanda tangan umum. Itu berarti metode pada number[] | string[] number[] | string[] seperti map (yang umum) masih tidak dapat dipanggil.


Di sisi lain, metode seperti forEach sekarang akan dapat dipanggil, tetapi di bawah noImplicitAny mungkin ada beberapa masalah.


 interface Dog { kind: "pupper" dogProp: any; } interface Cat { kind: "kittyface" catProp: any; } const catOrDogArray: Dog[] | Cat[] = []; catOrDogArray.forEach(animal => { // ~~~~~~ error! // Parameter 'animal' implicitly has an 'any' type. }); 

Sementara kami akan terus meningkatkan pengalaman di sini, ini benar-benar lebih mampu di TypeScript 3.3, dan menambahkan anotasi tipe eksplisit akan bekerja.


 interface Dog { kind: "pupper" dogProp: any; } interface Cat { kind: "kittyface" catProp: any; } const catOrDogArray: Dog[] | Cat[] = []; catOrDogArray.forEach((animal: Dog | Cat) => { if (animal.kind === "pupper") { animal.dogProp; // ... } else if (animal.kind === "kittyface") { animal.catProp; // ... } }); 

Menonton file tambahan untuk proyek komposit di --build --watch


Di TypeScript 3.0, kami memperkenalkan fitur baru untuk penataan bangunan yang disebut "proyek komposit". Bagian dari tujuan di sini adalah untuk memastikan pengguna dapat memecah proyek-proyek besar menjadi bagian-bagian kecil yang membangun dengan cepat dan mempertahankan struktur proyek, tanpa mengorbankan pengalaman TypeScript yang ada. Berkat proyek komposit, TypeScript dapat menggunakan mode --build untuk mengkompilasi ulang hanya set proyek dan dependensi. Anda dapat menganggap ini sebagai mengoptimalkan pembangunan antar- proyek.


Namun, sekitar tahun lalu tim kami juga mengirimkan mode --watch dioptimalkan dibangun melalui API "pembangun" tambahan yang baru. Dalam nada yang sama, ide keseluruhan adalah bahwa mode ini hanya memeriksa ulang dan memancarkan kembali file yang diubah atau file yang ketergantungannya mungkin berdampak pada pengecekan tipe. Anda dapat menganggap ini sebagai mengoptimalkan pembangunan dalam proyek.


Mungkin ironisnya, membangun proyek komposit menggunakan --build --watch sebenarnya tidak menggunakan infrastruktur ini. Pembaruan dalam satu proyek dalam mode --build --watch akan memaksa pembangunan penuh proyek itu, daripada menentukan file mana dalam proyek yang terpengaruh.


Dalam TypeScript 3.3, --build mode --watch juga meningkatkan menonton file tambahan. Itu bisa berarti membangun lebih cepat secara signifikan di bawah --build --watch . Dalam pengujian kami, fungsionalitas ini menghasilkan pengurangan 50% hingga 75% pada waktu build dari waktu --build --watch asli. Anda dapat membaca lebih lanjut tentang permintaan tarikan asli untuk perubahan untuk melihat angka-angka tertentu, tetapi kami percaya sebagian besar pengguna proyek komposit akan melihat kemenangan signifikan di sini.


Apa selanjutnya


Di luar 3.3, Anda dapat mengawasi halaman Roadmap kami untuk pekerjaan apa pun yang akan datang.


Tetapi saat ini kami sedang menantikan untuk mendengar tentang pengalaman Anda dengan RC, jadi cobalah sekarang dan beri tahu kami pendapat Anda!


- Daniel Rosenwasser dan tim TypeScript

Source: https://habr.com/ru/post/id437652/


All Articles