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