Typescript
extends
extends 在 TypeScript 中有两种核心用法:泛型约束和条件类型。两者都基于同一个概念——判断一个类型是否"兼容"另一个类型。
泛型约束
使用 T extends SomeType 可以限制泛型参数必须满足某个结构,从而在函数体内安全地访问该结构的属性。
function logLength<T extends { length: number }>(arg: T): void {
console.log(arg.length)
}
logLength('hello') // OK,string 有 length 属性
logLength([1, 2, 3]) // OK,array 有 length 属性
// @errors: 2345
logLength(42) // Error,number 没有 length 属性T extends { length: number } 表示 T 必须是一个含有 length 属性的类型。传入不满足条件的类型时,TypeScript 在编译阶段就会报错。
条件类型
使用 T extends U ? X : Y 可以根据类型关系返回不同的类型,语法类似三元表达式。
type IsString<T> = T extends string ? true : false
type A = IsString<'hello'> // true
type B = IsString<42> // falseT extends string 表示"如果 T 可以赋值给 string",条件成立时返回 true,否则返回 false。
条件类型常与 infer 搭配,从复杂类型中提取子类型:
type UnwrapPromise<T> = T extends Promise<infer R> ? R : T
type A = UnwrapPromise<Promise<number>> // number
type B = UnwrapPromise<string> // stringinfer R 让 TypeScript 推断出 Promise 内部的类型,并将其绑定到 R。