假设:
obj
问题:对于上面给出的情况,我如何声明type Obj<T in keys> = {
T: string;
}
的类型?
类似的东西:
|-----------------------------|
| column | |
| e1 | Expand (RichText) |
| e2 | |
| expand | |
|-----------------------------|
答案 0 :(得分:1)
接近你想要的东西是可能的。首先,我们需要改进数组的类型。默认情况下,keys
数组的类型为string[]
,这对我们没有帮助,因为我们需要字符串值的字符串文字类型。这个辅助函数将有助于:
function arrayHelper<T extends string>(a: T[]) : T[] {
return a;
}
var keys = arrayHelper(["A1", "B1", "C1"]); // The type of keys will be ("A1" | "B1" | "C1")[]
现在我们有了字符串文字类型,我们可以根据它们轻松定义类型:
var object = (<T extends string>(o: T[]) =>
{
const obj: { readonly [P in T]: P} = <any>{}
keys.forEach((key) => {
obj[key] = key
});
return obj;
})(keys);
object
的类型将是
var object: {
readonly A1: "A1";
readonly B1: "B1";
readonly C1: "C1";
}
具有原始值作为键的对象以及与字符串文字相同类型的值。
关键是完整值而不是子字符串(不可能在属性名称上执行复杂的突变),但这可能是您可以使用的。