我正在努力更好地理解查找类型在TypeScript中的工作方式。
我见过T[数字]被用作一种查找类型,它给出了一个并集,如下所示:
type Tuple = ['cat', 'dog', 'elephant']
type TupleToUnion = Tuple[number]
// gives union type: 'cat' | 'dog' | 'elephant'
我想使用T[string]对对象类型进行类似的查找。结果不成功:
type Obj = { 'cat': 'cat', 'dog': 'dog', 'elephant': 'elephant' }
type ObjToUnion = Obj[string]
// Type 'Obj' has no matching index signature for type 'string'. (2537)
为什么T[number]可以作为查找类型而T[string]不能?
数组类型有一个类似的接口:
interface ArrayLike<T> {
length: number;
[key: number]: T;
}
因此,ArrayType[number]
是正确的,因为接口指定所有密钥都是数字类型。
对于自定义对象类型,如您在示例中使用的对象类型:
type Obj = {
'cat': 'cat';
'dog': 'dog';
'elephant': 'elephant'
}
虽然所有键都是字符串类型,但只有3个特定的字符串键有效:cat
、dog
、elephant
。因此,执行Obj[string]
是错误的,因为string
表示所有字符串值(如abc
、hello
等(,而不仅仅是3个键。
要使用Obj[string]
,您需要以类似于ArrayLike:的方式声明它
type Obj = {
[key: string]: string;
}
type ObjToUnion = Obj[string]; // ok
要只从对象中获取密钥,可以使用keyof
运算符:
type Obj = {
'cat': 'cat';
'dog': 'dog';
'elephant': 'elephant'
}
type ObjToUnion = Obj[keyof Obj];
游乐场
编辑
这被称为索引签名。它的文档可以在这里找到。