【问题标题】:Typescript - Key/value type with known keysTypescript - 具有已知键的键/值类型
【发布时间】:2021-01-18 04:17:03
【问题描述】:

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

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

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

如何在 typescript 中定义这个?

我已经试过了:

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

或者这个

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

TS 不会接受 ID 上的字符串并期望它是一个数字

有什么办法吗?

谢谢!

【问题讨论】:

标签: typescript typescript-typings


【解决方案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
});

【讨论】:

    【解决方案2】:

    这是因为你定义了[key: string]: number 并且类型参数是主要的。所以每个密钥标识符都必须有数字类型(并且 ID 用于智能感知)。要解决它,您必须这样做:

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

    【讨论】:

    • 谢谢,但我希望其他键是字符串,我只想要数字。这可能会使错误消失,但我的类型会不那么严格
    • 我知道,这是实际 TypeScript 的问题。如果你说 [key: string]: number,它在所有情况下都必须是 number。不存在其他解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2020-10-20
    • 2017-08-08
    • 2019-04-05
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多