【发布时间】:2021-10-24 13:33:32
【问题描述】:
给定以下代码:
type Id = 1 | 2;
type Obj = {
[key in `charge_${Id}_a` | `charge_${Id}_b`]: string
};
function func(id: Id) {
const obj: Obj = {
[`charge_${id}_a`]: "a",
[`charge_${id}_b`]: "b",
}
return obj;
}
我希望 obj 符合 Obj,但我收到以下错误:
类型 '{ [x: string]: string; }' 缺少类型“Obj”的以下属性:charge_1_a、charge_2_a、charge_1_b、charge_2_b(2739)
意思是,Typescript 将obj 推断为{ [x: string]: string; } 而不是Obj。
See playground
【问题讨论】:
-
据我所知,它不应该遵守。
const obj: Obj = { charge_1_b: "foo" };这不会编译,因为它缺少charge_1_a、charge_2_a、charge_2_b。自己试试。我明白了,TS 将charge_${id}_a推断为string,而不是charge_1_a | charge_2_a -
不幸的是,对于具有计算属性的对象,我认为您无法推断出索引类型
{[x: string]: string}以外的其他内容,但是您的Obj类型也存在问题。您将其定义为一个对象,其中包含所有id值的字段,但查看func似乎您希望每个id一个对象的联合:tsplay.dev/Wv8QRN
标签: typescript template-literals