是否可以在文字而不是接口上使用`keyof`运算符?

Ric*_*ick 40 typescript

我有一个对象文字,如下所示(所有属性在编译时都是已知的):

const foo = {
  "hello": "hola"
};
Run Code Online (Sandbox Code Playgroud)

如果foo是界面而不是变量,我可以很容易地做类似的事情

/** THEORETICAL ONLY - Does not compile! */
function translate(input: keyof foo): string {
  return foo[input];
}
Run Code Online (Sandbox Code Playgroud)

但是,使用变量这样做不起作用,因为编译器找不到具有该名称的接口foo.

Typescript是否支持keyof对在编译时已知其值的对象文字的操作?

Rya*_*ugh 99

keyof对类型进行操作,但它foo是一种价值.但是typeof操作符接受一个值并生成其类型,因此您可以使用它keyof typeof foo来执行此操作.

  • 你是世界上最聪明的人吗? (34认同)
  • 这编译但实际上并没有提供我传递的字符串的任何反馈.我可以把任何我想要的东西放在那里,它不会抱怨. (5认同)
  • 请注意,这仅在您没有将对象与对象文字相关联时才有效. (5认同)

Eri*_*ric 11

有点偏离,虽然我正在寻找文字的索引器键,但将其放在这里以供将来参考。

const foo = {
  "hello": "hola"
};

let data: { [key in keyof typeof foo]:number} & { name: string, index: number }[] = [] as any;

data.foo = 1;
data[0] = {name:'foo', 1};
Run Code Online (Sandbox Code Playgroud)