在Typescript中创建一个对象的类型,其键是从一个字符串数组派生的

时间:2018-01-29 18:03:47

标签: typescript

假设:

obj

问题:对于上面给出的情况,我如何声明type Obj<T in keys> = { T: string; } 的类型?

类似的东西:

|-----------------------------|
| column  |                   |
|  e1     | Expand (RichText) |
|  e2     |                   |
|  expand |                   |
|-----------------------------|

1 个答案:

答案 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";
}

具有原始值作为键的对象以及与字符串文字相同类型的值。

关键是完整值而不是子字符串(不可能在属性名称上执行复杂的突变),但这可能是您可以使用的。