打字稿-具有已知键的键/值类型

时间:2020-10-02 13:25:41

标签: typescript typescript-typings

我有一个看起来像这样的对象

const o: A = {
    id: 'foo',
    key1: 123,
    key2: 456
}

idstring类型的已知和必需属性。其他键是动态键,是数字。

如何在打字稿中定义它?

我已经尝试过了:

type A = {
    id: string;
    [key: string]: number
} // Doesn't work

或这个

type A = {
    id: string 
} & {
    [key: string]: number
} // Doesn't work either

TS不会接受ID上的字符串,并希望它是数字

有解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

type MyObject<K extends keyof any> = { id: string } & Record<Exclude<K, "id">, number>;

function myObjectWrapper<T extends MyObject<keyof T>>(metrics: T): MyObject<keyof T> {
    return metrics;
}

const a = myObjectWrapper({
    id: "foo",
    key1: 123,
    key2: 456
});

答案 1 :(得分:0)

这是因为您定义了[key: string]: number且type参数为main。因此,每个密钥标识符都必须具有数字类型(ID用于智能感知)。要解决它,您必须执行以下操作:

type A = {
    id: string;
    [key: string]: number | string
};
var a: A = {
    id: "foo",
    key1: 123,
    key2: "bar" // this is also valid
};