为什么Tuple[number]类型检查而Obj[string]不检查



给定:

type UserObj = { name: string; age: number; role: "admin" | "standard"; };
type ObjValues = UserObj[string];
type UserTuple = [ string, number, "admin" | "standard" ];
type TupleValues = UserTuple[number];

为什么TupleValues类型检查而ObjValues不检查?

我很清楚我可以使用keyof

TypeScript中的数组类型,包括像UserTuple这样的元组类型,都具有数字索引签名,以表示如果使用类型为number的键对数组进行索引,则将获得该数组的某些元素。(好吧,或者undefined,但TypeScript传统上忽略了这种可能性;如果你关心的话,请参阅--noUncheckedIndexedAccess编译器选项。(由于数组具有数字索引签名,这意味着你可以索引到键类型为number的数组/元组类型中。

另一方面,任意对象类型(如UserObj(通常不具有string索引签名(或任何索引签名(。因此,您不能总是使用string键类型对对象类型进行索引。

这就回答了问题。

对于其他有此问题的人来说,如果您想从任意对象类型X获取属性值类型的并集,则应该使用keyof X对其进行索引,使用keyof类型运算符首先获取允许键的并集。在上面的示例代码中,这将是UserObj[keyof UserObj]。但从技术上讲,这超出了这个问题的范围,因此才有了细则

UserObj[string]对于您定义的类型没有意义,键应该是属性的确切名称,例如UserObj["name"]或对象键"name" | "age" | "role"的并集(您可以使用keyof关键字获得对象键的并集(。但元组的情况不同,UserTuple[number]本身就是一种约定,使每个元组成员的并集成为类型。

因此UserTuple[number] = string | number | "admin" | "standart"CCD_ 22。

最新更新