【问题标题】: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]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2020-07-10
      • 2019-08-16
      相关资源
      最近更新 更多