在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中做到这一点?
答案 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
希望有所帮助;祝你好运!