TypeScript 類型推斷
TypeScript 類型檢查機制包含三個部分:
- 類型推斷
- 類型保護
- 類型兼容性
本節(jié)介紹其中的類型推斷,類型推斷主要用于那些沒有明確指出類型的地方幫助確定和提供類型,這是 TypeScript 的一種能力。
類型推斷是有方向的,要注意區(qū)分從左向右和從右向左兩種推斷的不同應用。
1. 慕課解釋
類型推斷的含義是不需要指定變量類型或函數(shù)的返回值類型,TypeScript 可以根據(jù)一些簡單的規(guī)則推斷其的類型。
2. 基礎(chǔ)類型推斷
基礎(chǔ)的類型推斷發(fā)生在 初始化變量,設(shè)置默認參數(shù)和決定返回值時。
初始化變量例子:
let x = 3 // let x: number
let y = 'hello world' // let y: string
let z // let z: any
代碼解釋:
變量 x
的類型被推斷為數(shù)字,變量 y
的類型被推斷為字符串。如果定義時沒有賦值,將被推斷為 any 類型。
設(shè)置默認參數(shù)和決定返回值時的例子:
// 返回值推斷為 number
function add(a:number, b:10) {
return a + b
}
const obj = {
a: 10,
b: 'hello world'
}
obj.b = 15 // Error,Type '15' is not assignable to type 'string'
代碼解釋:
第 1 行,參數(shù) b 有默認值 10,被推斷為 number 類型。
第 2 行,兩個 number 類型相加,函數(shù) add()
返回值被推斷為 number 類型。
最后一行,obj
的類型被推斷為 {a: number, b: string}
,所以屬性 b 不能被賦值為數(shù)字。
const obj = {
protagonist: 'Sherlock',
gender: 'male'
}
let { protagonist } = obj
代碼解釋: 通過解構(gòu)賦值也可以完成正確的類型推斷:let protagonist: string
。
3. 最佳通用類型推斷
當需要從多個元素類型推斷出一個類型時,TypeScript 會盡可能推斷出一個兼容所有類型的通用類型。
比如聲明一個數(shù)組:
let x = [1, 'imooc', null]
代碼解釋: 為了推斷 x
的類型,必須考慮所有的元素類型。這里有三種元素類型 number、string 和 null,此時數(shù)組被推斷為 let x: (string | number | null)[]
聯(lián)合類型。
Tip: 是否兼容 null 類型可以通過 tsconfig.json 文件中屬性
strictNullChecks
的值設(shè)置為 true 或 false 來決定。
4. 上下文類型推斷
前面兩種都是根據(jù)從右向左流動進行類型推斷,上下文類型推斷則是從左向右的類型推斷。
例如定義一個 Animal
的類作為接口使用:
class Animal {
public species: string | undefined
public weight: number | undefined
}
const simba: Animal = {
species: 'lion',
speak: true // Error, 'speak' does not exist in type 'Animal'
}
代碼解釋: 第 6 行,將 Animal 類型
顯示的賦值給 變量 simba
,Animal 類型
沒有 speak 屬性
,所以不可賦值。
5. 小結(jié)
本小節(jié)介紹了一些常見的類型推斷方式,需要明白從右向左和從左到右兩種類型推斷方法的區(qū)別及應用,在項目中靈活運用。