使用字符串数组中的成员键入

时间:2017-06-21 16:22:46

标签: typescript

考虑以下接口声明:

interface Foo {
    bar(keys: string[], handler: (parameter: any) => void): void;
}

如何表示处理程序的parameter是一个对象,其成员的键位于keys数组中?

var x: Foo;
x.bar(['First', 'Second'], x => {
    console.log(x.First);
    console.log(x.Second);
});

2 个答案:

答案 0 :(得分:1)

你想要

  1. 将字符串文字捕获为字符串文字类型
  2. 的联合的东西
  3. 可以采用文字类型联合并从中创建对象的东西。
  4. (1)可以使用约束为string的类型参数(即通用)来完成,而(2)可以使用映射类型完成 - 而恰好是TypeScript发布了一个被调用的映射类型Record<K, T>用它:

    interface Foo {
        bar<K extends string>(keys: K[], handler: (parameter: Record<K, any>) => void): void;
    }
    
    var x: Foo;
    x.bar(['First', 'Second'], x => {
        console.log(x.First);
        console.log(x.);
    });
    

    enter image description here

    但是,请记住,如果有人传入空数组或字符串文字以外的其他内容(例如string类型的变量),那么您将无法获得类型安全性。您可以访问x上的任何媒体资源。

    你可以通过添加通用默认值never来解决空数组的情况,并说明#34;当给出一个空数组时,推断空联合而不是string&#34;:

    interface Foo {
        bar<K extends string = never>(keys: K[], handler: (parameter: Record<K, any>) => void): void;
    }
    

答案 1 :(得分:0)

您可以使用mapped types将数组中的每个项目映射为键:

pressmove