我有一个看起来像这样的对象
const o: A = {
id: 'foo',
key1: 123,
key2: 456
}
id
是string
类型的已知和必需属性。其他键是动态键,是数字。
如何在打字稿中定义它?
我已经尝试过了:
type A = {
id: string;
[key: string]: number
} // Doesn't work
或这个
type A = {
id: string
} & {
[key: string]: number
} // Doesn't work either
TS不会接受ID上的字符串,并希望它是数字
有解决方案吗?
谢谢!
答案 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
};