为什么 T[string] 在 TypeScript 中不是有效的对象查找类型?



我正在努力更好地理解查找类型在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个特定的字符串键有效:catdogelephant。因此,执行Obj[string]是错误的,因为string表示所有字符串值(如abchello等(,而不仅仅是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];

游乐场

编辑

这被称为索引签名。它的文档可以在这里找到。

最新更新