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