此问题已在此处有答案:
Computed property name is not assignable to Record type(1个答案)
6天前关闭。
我正在尝试编写一个函数,它接受一个字符串作为输入,并返回一个字典,其中输入字符串作为唯一允许的键。这是我目前掌握的情况
我有一个Dict
类型,它接受一个类型扩展字符串,并且只允许该类型的成员成为成员:
type Dict<TIdentity extends string> = {
[TAddress in TIdentity]?: number
};
这是正确的,例如这里:
type typ = 'abc';
const x: Dict<typ> = {
'abc': 1,
'def': 2 // type error
}
类型错误是:
Type '{ abc: number; def: number; }' is not assignable to type 'Dict<"abc">'.
Object literal may only specify known properties, and ''def'' does not exist in type 'Dict<"abc">'.
现在我写了这个函数来获取一个字符串并返回一个Dict
,并将其作为键:
function get<TIdentity extends string>(
identity: TIdentity
): Dict<TIdentity> {
return {
[identity]: 3
}
}
我的想法是,我可以这样写代码:
const result = get('def')
// correctly allowed
result.def;
result['def'];
// correctly disallowed
result.ghi;
result['ghi'];
但是我在get
返回时得到了一个类型错误:
Type '{ [x: string]: number; }' is not assignable to type 'Dict<TIdentity>'.
看起来,尽管我在identity: TIdentity
中使用了相同的TIdentity
类型和返回类型Dict<TIdentity>
,但identity
键被视为字符串,而不是TIdentity
类型。有没有什么方法可以避免这种情况,并让Typescript将identity
视为TIdentity
,以便对返回的dict进行类型检查?我也试过做[identity as TIdentity]: 3
,得到同样的错误。
这里是Playground
1条答案
按热度按时间0sgqnhkj1#
这也应该在不禁用typescript的类型检查的情况下工作
这是一个 typescript -Playground