Mengumumkan TypeScript 3.3

Jika Anda tidak terbiasa dengan TypeScript, itu adalah bahasa yang membawa pengecekan tipe statis ke JavaScript sehingga Anda dapat menangkap masalah bahkan sebelum Anda menjalankan kode Anda - atau bahkan sebelum Anda menyimpan file Anda. Ini juga termasuk fitur JavaScript terbaru dari standar ECMAScript pada browser dan runtime yang lebih lama dengan mengkompilasi fitur-fitur itu ke dalam bentuk yang mereka mengerti. Tetapi selain memeriksa dan mengkompilasi kode Anda, TypeScript juga menyediakan alat dalam editor favorit Anda sehingga Anda dapat melompat ke definisi variabel apa pun, menemukan siapa yang menggunakan fungsi yang diberikan, dan mengotomatisasi refactoring dan perbaikan untuk masalah umum.


Asli di blog

TypeScript bahkan menyediakan ini untuk pengguna JavaScript (dan juga dapat mengetik-periksa kode JavaScript yang diketik dengan JSDoc), jadi jika Anda telah menggunakan editor seperti Visual Studio atau Visual Studio Code pada file .js , TypeScript mendukung pengalaman itu.


Untuk memulai dengan TypeScript, Anda bisa mendapatkannya melalui NuGet , atau melalui npm dengan perintah berikut:


 npm install -g typescript 

Anda juga dapat memperoleh dukungan editor dengan



TypeScript 3.3 adalah rilis yang lebih kecil dari biasanya dan tidak mengandung perubahan, sehingga harus mudah untuk ditingkatkan jika Anda menggunakan versi yang lebih lama. 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 di bawah --build --watch mode akan memaksa membangun 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.


Pengeditan JavaScript dalam Teks Sublime


Berkat kerja yang dilakukan oleh mantan anggota tim TypeScript Zhengbo Li dan kontributor komunitas @idiotWu , plugin TypeScript kami untuk Sublime Text sekarang mendukung pengeditan dalam file JavaScript! Ini berarti pengguna akan mendapatkan penyelesaian yang lebih akurat, ganti nama, definisi, dan lebih banyak lagi dalam kode JavaScript yang menggunakan JSDoc dan berinteroperasi dengan kode TypeScript.


Menggunakan fitur pengeditan JavaScript dalam file .js dalam Sublime Text 3


Apa selanjutnya


Jika Anda melewatkannya, proyek TypeScript baru-baru ini menerbitkan peta jalan 6 bulan kami untuk menguraikan pekerjaan yang kami harapkan akan ditangani antara Januari dan Juni. Untuk melacak fitur yang akan datang dalam TypeScript 3.4 dan maju, Anda dapat mengawasi halaman peta jalan fitur kami .


Kami berharap TypeScript 3.3 terus membuat Anda lebih produktif, dan membuat Anda lebih bahagia saat Anda membuat kode. Jika Anda menikmatinya, beri tahu kami di Twitter , dan jika Anda punya saran tentang apa yang bisa kami tingkatkan, ajukan masalah ke GitHub .


Selamat melakukan peretasan!

- Daniel Rosenwasser dan tim TypeScript

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


All Articles