Typescript动态访问属性

Typescript动态访问属性,typescript,Typescript,下面是一个演示: 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](); 我想通过用户输入创建一些东西,

下面是一个演示:

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中,它告诉我一些错误


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

由于错误提示,一种解决方案是向类型添加索引签名,以便允许通过任何字符串进行索引:

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]();

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

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
有许多其他属性/util,比如:
mylibs.utils.request
mylibs.constants.X
,那么哪个解决方案更好呢?我终于找到了答案:
让VecType:'Vec2'|'Vec3'|'Vec4'='Vec'+len。两种解决方案都可以使用。。但这并不理想,我会更新我的答案shortly@user2331095是的,这也是我要说的:)。您也可以使用索引解决方案,但索引将返回
any
,而不是
new()=>any
谢谢。我还有一个问题:如果
mylibs
有许多其他属性/util,比如:
mylibs.utils.request
mylibs.constants.X
,那么哪个解决方案更好呢?我终于找到了答案:
让VecType:'Vec2'|'Vec3'|'Vec4'='Vec'+len。两种解决方案都可以使用。。但这并不理想,我会更新我的答案shortly@user2331095是的,这也是我要说的:)。您也可以使用索引解决方案,但索引将返回
any
,而不是
new()=>any