Typescript Record<number, string> 接受键上的数字

Shu*_*ulz 3 promise typescript

我是打字稿的新手,还有很多东西需要研究,但我偶然发现了这段代码,它让我对记录实用程序类型感到非常困惑。

这段代码适用于操场

const data = async (name: string, id: number): Promise<Record<number,string>> => {
  const obj = {
    foo: 'bar', //shouldn't this not work since I've used 'number'?
  }
  return obj
}
Run Code Online (Sandbox Code Playgroud)

这个没有(第二行)

const foo1: Record<string, string> = { foo: 'bar' }
const foo2: Record<number, string> = { foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我也不确定“密钥”中应该使用哪种数据类型。尝试打字稿游乐场

cap*_*ian 5

这是因为 TS 应该兼容 JavaScript。

考虑这个纯js代码:

const foo={
  0:42
}

const x = foo['0'] // number
const y = foo[0] // number
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,JS 允许您同时使用字符串和数字键0: 42

请参阅 js 和 ts 文档:

js解释

属性名称 属性名称是字符串或符号。任何其他值(包括数字)都会被强制转换为字符串。这会输出“value”,因为 1 被强制转换为“1”。

ts 解释

可以支持两种类型的索引器,但从数字索引器返回的类型必须是从字符串索引器返回的类型的子类型。这是因为当使用 a 进行索引时,JavaScript在索引到对象之前number实际上会将其转换为 a 。string这意味着使用100(a ) 进行索引与使用(a )number进行索引是相同的,因此两者需要保持一致。"100"string

为什么是这样?我也不确定“密钥”中应该使用哪种数据类型。

TypeScript 具有内置的键类型:type PropertyKey = string | number | symbol

PropertyKey无需声明即可使用。这种类型是内置的