【问题标题】:Typescript dynamic access propertyTypescript 动态访问属性
【发布时间】:2018-01-24 08:05:05
【问题描述】:

这是一个演示:

class Vec2 {};
class Vec3 {};
class Vec4 {};

let mylibs = {
    Vec2: Vec2,
    Vec3: Vec3,
    Vec4: Vec4
};
let len = Math.round(Math.random() * 2) + 2;
let VecType = 'Vec' + len;
let randomVector = new mylibs[VecType]();

我想通过用户输入创建一些东西,VecType 是我用来模拟用户输入的东西。 上面的代码有效,tsc 不会抛出任何错误。但是在我的 vscode 中,它告诉我一些错误。

我想解决这种错误。谢谢。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    正如错误所暗示的,一种解决方案是向类型添加索引签名,以便允许按任何字符串进行索引:

    let mylibs : { [key: string]:  new () => any} = {
        Vec2: Vec2,
        Vec3: Vec3,
        Vec4: Vec4
    };
    

    如果您想更加严格,可以使用 Vec* 类型的基类或所有属性类型 (Vec2|Vec3|Vec4) 的联合类型来代替任何类型

    另一种选择是不按通用字符串索引,而是按作为mylibs 键的字符串索引。动态构造这样的字符串会涉及到一个不是特别安全的强制转换:

    let VecType: keyof typeof mylibs = ('Vec' + len) as any;
    let randomVector = new mylibs[VecType]();
    

    【讨论】:

    • 谢谢。我还有一个问题:如果mylibs 有许多其他属性/实用程序,例如:mylibs.utils.requestmylibs.constants.X,哪个解决方案更好?
    • 我终于弄明白了:let VecType: 'Vec2' | 'Vec3' | 'Vec4' = 'Vec' + len as any;.
    • 两种解决方案都可以使用..但并不理想,我会尽快更新我的答案
    • @user2331095,是的,这也是我要说的:)。您也可以使用索引解决方案,但索引将返回 any 而不是 new ()=>any
    猜你喜欢
    • 2017-09-30
    • 2020-10-07
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多