Typescript函数,它根据函数输入返回带有键的dict [重复]

e4yzc0pl  于 2023-05-01  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

此问题已在此处有答案

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

0sgqnhkj

0sgqnhkj1#

这也应该在不禁用typescript的类型检查的情况下工作

function get<TIdentity extends string>(key: TIdentity): Dict<TIdentity> {
    const result: Dict<TIdentity> = {}
    result[key] = 3
    
    return result
}

这是一个 typescript -Playground

相关问题