FumadocsZDecode
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>      // false

T 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>          // string

infer R 让 TypeScript 推断出 Promise 内部的类型,并将其绑定到 R

On this page