通用传递对象密钥

时间:2019-08-27 09:54:19

标签: typescript

在TypeScript中,是否可以将对象中的每个键作为通用键传递给该对象中的每个对应值?例如:

@testaccount

如果键是字符串文字,则可以实现:

interface Items
{
    [key: Key extends string]: Item <Key>;
};

interface Item <Key>
{
    name: Key;
};

我不确定如何扩展它以允许任何字符串。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您有一个通用类型,可以根据键类型计算值类型:

interface Item<Key> {
    name: Key;
};

给定一个集合,它是键类型的Name,您可以计算总体对象类型。那么为什么不将Name设为通用?

type Items<Name extends string> = {
    [Key in Name]?: Item<Key>;
};

现在,您要验证给定类型(即对象文字的类型)是否适合Items约束。也就是说,是否存在类型Name,以使对象文字的类型恰好是Items。 TypeScript中没有直接形成存在类型的形式,但这可以通过从函数参数进行推断来实现:

function checkType<Name extends string>(items: Items<Name>): Items<Name> {
    return items;
}

像这样使用它:

const items = checkType({
    a: {
        name: 'a',
    },
    b: {
        name: 'c', // cannot pass the check
        // name: 'b', // passes the check
    },
});