我想知道如何在给定属性键的情况下推断属性类型。我不确定这个术语是否准确,因此我将使用示例进行描述(如果我使用了错误或令人困惑的术语,请纠正我)。
给定以下类型:
type Person = {
name: string;
age: number;
}
type Settable<Value> = {
value: Value;
setValue: (value: Value) => void;
}
我本质上希望最终得到一个类似于以下内容的类型,但希望以更加编程化、通用的方式实现这一点:
type SettablePerson = {
name: Settable<string>;
age: Settable<number>;
}
我认为我可以通过Record
类型来实现这一点,但我不确定如何推断每个键的正确属性类型。到目前为止我有:
type SettablePerson = Record<keyof Person, Settable<unknown>>;
我希望它是每个Settable
属性的类型,而不是每个属性都有一个类型,这样以下内容应该是有效的:unknown
let personName: string = 'john';
let personAge: number = 20;
const settablePerson: SettablePerson = {
name: {
value: personName,
setValue: (value: string) => personName = value
},
age: {
value: personAge,
setValue: (value: number) => personAge = value
},
}
这是可能吗?提前致谢!
编辑:
以下是完全无效的 Typescript,但可能有助于说明我如何实现这一目标的思路:
type SettablePerson2 = Record<keyof Person => key, Settable<typeof Person[key]>>;
您可以通过使用映射类型来完成您想要的操作。本质上,它们允许通过联合、键进行映射并更改值:
操场