是否可以在TypeScript中从字符串文字数组中定义联合类型别名?

时间:2017-09-20 15:02:45

标签: typescript types typescript-typings typescript2.0

在TypeScript中,我可以做以下两件事:

type ToolboxSpaceType = 'screw'|'hammer'|'screwdriver'; // 1

ProxyProperties = ['screw', 'hammer', 'screwdriver'];  // 2

class Toolbox {
  [key: ToolboxSpaceType]: ToolboxSpace;
}

let proxyHandler = {
  get(target: Toolbox, prop: PropertyKey, receiver: any) {
    if (ProxyProperties.include(prop) {
       //...do something special...
    }
  }
}
let personalToolbox = new Toolbox();
let personalToolboxProxy = new Proxy(personalToolbox, proxyHandler)

我希望能够从ToolboxSpaceType字符串数组中生成ProxyProperties。有没有办法在TypeScript中做到这一点?

1 个答案:

答案 0 :(得分:1)

注意:帖子中显示的代码存在问题,并且不按编写的方式编译。以下答案仅涉及涉及ToolboxSpaceType类型和ProxyProperties数组的前两行,因为这就是您所询问的内容。

你可以做到。最好添加辅助函数,这样您的数组就不会被推断为string[]。以下函数强制将数组元素类型推断为字符串文字的并集:

function literalArray<K extends string>(args: K[]): K[] {
  return args;
}

现在,ProxyProperties被推断为('screw'|'hammer'|'screwdriver')[]

const ProxyProperties = literalArray(['screw', 'hammer', 'screwdriver']);  

您可以通过提取其元素类型来计算并集:

type ToolboxSpaceType = typeof ProxyProperties[number];

an answer to another question中,我推荐了一个辅助函数(tuple.ts中的tuple())来推断元组类型,这对你来说可能更好,因为ProxyProperties正好包含文字一旦按照已知的顺序。你会这样使用它:

const ProxyProperties = tuple('screw', 'hammer', 'screwdriver');  
//inferred as type ["screw", "hammer", "screwdriver"]

type ToolboxSpaceType = typeof ProxyProperties[number]; // still works

希望有所帮助;祝你好运!