Javascript 为什么在typescript中'keyof any'具有'string | number | symbol'类型?

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约束为对象的有效键。所以

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
约束为对象的有效键。所以
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
更准确。