关于TypeScript接口泛型extends联合类型及默认值的困惑
解析TypeScript泛型接口定义
先把你贴的代码拆成两个核心部分逐一拆解:
interface Foo<T extends string | string[] = string | string[]> { }
1. 泛型约束:T extends string | string[]
这里的string | string[]是联合类型,不是三个独立类型——|是TypeScript的联合类型运算符,用来表示「二选一」的类型范围:
- 可选类型一:单个字符串类型
string - 可选类型二:字符串数组类型
string[]extends在这里的作用是限定:你给Foo指定的泛型T,必须是这两种类型中的任意一种(或是它们的子类型)。完全不存在「把数组赋值给string」的操作,只是划定了泛型的可选范围。
2. 泛型默认值:= string | string[]
这部分是给泛型T设置默认类型,意思是当你直接使用Foo而不指定具体泛型时(比如const foo: Foo = {}),T会自动被设为string | string[]这个联合类型。举几个实际使用的例子:
// 未指定泛型,T自动为string | string[] const foo1: Foo = {}; // 明确指定T为string,符合约束 const foo2: Foo<string> = {}; // 明确指定T为string[],符合约束 const foo3: Foo<string[]> = {}; // 下面这种会报错,因为number不在约束范围内 // const foo4: Foo<number> = {};
你之前误解成「三个类型」,应该是把string | string[]错误拆分了——|是语法运算符,不是独立类型,它只是把前后两个类型合并成一个可选集合。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

