Javascript 为什么在typescript中'keyof any'具有'string | number | symbol'类型?
typescript中的类型Javascript 为什么在typescript中'keyof any'具有'string | number | symbol'类型?,javascript,typescript,Javascript,Typescript,typescript中的类型记录定义为: 类型记录={ [P in K]:T; } 我不明白为什么在这里使用任何键 检查后,我发现任何的键的类型都是string | number | symbol。这是为什么?any键表示可以用作对象索引的任何值的类型。目前,您可以使用字符串或数字或符号索引到对象中 let a: any; a['a'] //ok a[0] // ok a[Symbol()] //ok a[{}] // error 在记录类型中,任何的K扩展键用于将K约束为对象的有效键。所以
记录
定义为:
类型记录={
[P in K]:T;
}
我不明白为什么在这里使用任何键
检查后,我发现任何的
键的类型都是string | number | symbol
。这是为什么?any键表示可以用作对象索引的任何值的类型。目前,您可以使用字符串
或数字
或符号
索引到对象中
let a: any;
a['a'] //ok
a[0] // ok
a[Symbol()] //ok
a[{}] // error
在记录
类型中,任何
的K扩展键用于将K
约束为对象的有效键。所以K
可以是'prop'
或'1'
或string
,但不能是{a:string}
:
type t0 = Record<1, string> // { 1: string }
type t1 = Record<"prop", string> // { prop: string }
type t3 = Record<string, string> // { [name: string]: string }
type t4 = Record<number, string> // { [name: number]: string }
type t5 = Record<{a : string}, string> // error
type t0=Record/{1:string}
类型t1=Record/{prop:string}
类型t3=Record/{[名称:string]:string}
类型t4=Record/{[name:number]:string}
类型t5=记录//错误
约束就在这里,因为传入K
的任何类型都将成为结果类型的键,因此K
必须是对象的有效键。据我所知Record
无效。您可以使用const a:Record={};a[1]=“嘿”
,它是有效的,但您不能将number用于第一种类型的记录
,因为正如您所说的“K
必须是对象的有效键”-它只是一个字符串或符号(数字被强制为字符串)@HelloWorld当然可以:TS支持数字索引签名,并且它确保只使用数字来表示我的坏,意识到我有keyOfStringOnly=true
。正如它给我的:TS2344:类型“number”不满足约束“string”。错误
@HelloWorld这是一个有趣的观察结果。看起来确实像是一次秘密握手。我会使用PropertyKey
来代替任何的键,以使其更加明确。尽管其中包括数字,可以将数字设置为键,但会转换为字符串,即使对于JS数组也是如此。因此,如果您想读取某些内容的结果,包括从今天起不再包含永远不会发生的数字的Reflect.ownKeys
,则string | symbol
更准确。