ts-node 是一個非官方的 npm 模塊,可以直接運(yùn)行 TypeScript 代碼。
npm install -g ts-nodets-node script.ts- 如果執(zhí)行 ts-node 命令不帶有任何參數(shù),它會提供一個 TypeScript 的命令行 REPL 運(yùn)行環(huán)境,你可以在這個環(huán)境中輸入 TypeScript 代碼,逐行執(zhí)行。
ts-node - 要退出這個 REPL 環(huán)境,可以按下 Ctrl + d,或者輸入.exit。
TypeScript 提供了一個編譯選項(xiàng)noImplicitAny,打開該選項(xiàng),只要推斷出any類型就會報(bào)錯。
tsc --noImplicitAny app.ts- 這里有一個特殊情況,即使打開了noImplicitAny,使用let和var命令聲明變量,但不賦值也不指定類型,是不會報(bào)錯的。
unknown跟any的相似之處,在于所有類型的值都可以分配給unknown類型。
- unknown類型的變量,不能直接賦值給其他類型的變量(除了any類型和unknown類型)。這就避免了污染問題,從而克服了any類型的一大缺點(diǎn)。
- 不能直接調(diào)用unknown類型變量的方法和屬性。
- unknown類型變量能夠進(jìn)行的運(yùn)算是有限的,只能進(jìn)行比較運(yùn)算(運(yùn)算符==、===、!=、!==、||、&&、?)、取反運(yùn)算(運(yùn)算符!)、typeof運(yùn)算符和instanceof運(yùn)算符這幾種,其他運(yùn)算都會報(bào)錯。
- TypeScript 有兩個“頂層類型”(any和unknown),但是“底層類型”只有never唯一一個。
注意,如果沒有聲明類型的變量,被賦值為undefined或null,在關(guān)閉編譯設(shè)置noImplicitAny和strictNullChecks時,它們的類型會被推斷為any。如果希望避免這種情況,則需要打開編譯選項(xiàng)strictNullChecks。
TypeScript 提供了一個編譯選項(xiàng)strictNullChecks。只要打開這個選項(xiàng),undefined和null就不能賦值給其他類型的變量(除了any類型和unknown類型)。
- 打開strictNullChecks以后,undefined和null這兩種值也不能互相賦值了。
- 總之,打開strictNullChecks以后,undefined和null只能賦值給自身,或者any類型和unknown類型的變量。
聯(lián)合類型可以與值類型相結(jié)合,表示一個變量的值有若干種可能。
let rainbowColor:'赤'|'橙'|'黃'|'綠'|'青'|'藍(lán)'|'紫';
交叉類型常常用來為對象類型添加新屬性。
type A = { foo: number };
type B = A & { bar: number };
- 上面示例中,類型B是一個交叉類型,用來在A的基礎(chǔ)上增加了屬性bar。
TypeScript 將typeof運(yùn)算符移植到了類型運(yùn)算,它的操作數(shù)依然是一個值,但是返回的不是字符串,而是該值的 TypeScript 類型。
const a = { x: 0 };
type T0 = typeof a; // { x: number }
type T1 = typeof a.x; // number
- 這種用法的typeof返回的是 TypeScript 類型,所以只能用在類型運(yùn)算之中(即跟類型相關(guān)的代碼之中),不能用在值運(yùn)算。
子類型可以賦值給父類型,反之不可以
let a:'hi' = 'hi';
let b:string = 'hello';
b = a; // 正確,a是值類型hi,它是string類型的子類
a = b; // 報(bào)錯,b是a的父類型,不可以