【问题标题】:How to reusing class constructor argument as literal string with TypeScript?如何使用 TypeScript 重用类构造函数参数作为文字字符串?
【发布时间】:2020-02-27 04:04:46
【问题描述】:
我该怎么做?
type Module = {
created: number;
}
class Example {
constructor(
public readonly moduleName: string
) { }
getModule = (modules: {
[this.moduleName]: Module // <-- property error
}) => modules[this.moduleName]
}
属性错误是“类型文字中的计算属性名称必须引用类型为文字类型或‘唯一符号’类型的表达式。”
操场是here
【问题讨论】:
标签:
typescript
class
generics
constructor
【解决方案1】:
这是你想要做的吗?
type Module = {
created: number;
}
class Test<T extends string> {
constructor(
public readonly moduleName: T
) { }
getModule = (modules: {
[key: string]: Module
}): Module => modules[this.moduleName]
}
您正试图在运行时将静态类型与动态程序集混合使用。如果不提供有关可能值的类型系统信息,例如 ModuleNames 作为字符串文字区分联合,它几乎无法告诉您它在运行时正在做什么。
看起来这个对象将采用模块的键控对象,并从那个“它自己的模块”返回。
像这样:
type Module = {
created: number;
}
interface ModuleCache { [key: string]: Module }
class Test<T extends string> {
constructor(
public readonly moduleName: T
) { }
getModule = (modules: ModuleCache): Module =>
modules[this.moduleName]
}