typescript - 如何根据 Typescript 中的类类型动态实例化类数组
问题描述
我实施了如下策略模式
interface IRule {
isMatch(n: number): boolean;
}
class Rule1 implements IRule {
isMatch(n: number) {
return n === 7;
}
}
class Rule2 implements IRule {
isMatch(n: number) {
return n % 2 === 0;
}
}
class Factory {
readonly rules: IRule[];
constructor() {
this.rules = [new Rule1(), new Rule2()];
}
public of(n: number) {
return this.rules.find(r => r.isMatch(n));
}
}
const found = new Factory().of(7);
问题:
TypeScript 中有没有一种方法Factory.Rules
可以根据类类型动态创建IRule
?
在 C# 中,这可以按如下方式完成:
var ruleTypeInterface = typeof(IRule);
var rulesType = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => ruleTypeInterface.IsAssignableFrom(t) && t.IsClass);
this.rules = rulesType.Select(rt => Activator.CreateInstance(rt) as IRule).ToArray();
解决方案
你在正确的轨道上,但有一些语法错误。
class Rule1: IRule {
isMatch(in: number) {
return number === 7;
}
}
当你有一个class
实现interface
你写的class Rule1 implements IRule
而不是class Rule1: IRule
.
in
是你的isMatch
方法中的变量名并且number
是类型,但是你使用number
它就好像它是变量名一样。 in
也是保留字,所以我们n
改用。
您Factory
有相同的in
保留字问题。它也有一个错误A class member cannot have the 'const' keyword
。也许你想成功readonly
?
interface IRule {
isMatch(n: number): boolean;
}
class Rule1 implements IRule {
isMatch(n: number) {
return n === 7;
}
}
class Rule2 implements IRule {
isMatch(n: number) {
return n % 2 === 0;
}
}
class Factory {
readonly rules: IRule[];
constructor() {
this.rules = [new Rule1(), new Rule2()];
}
public of(n: number) {
return this.rules.find(r => r.isMatch(n));
}
}
const found = new Factory().of(7);
这一切现在都有效。推断的类型found
是IRule | undefined
因为我们不知道(仅基于类型)是否of
会找到匹配项。
推荐阅读
- python - 删除数据框 PANDAS 中的重复项
- c++ - C++ 不报告数据类型不匹配的错误或警告
- reactjs - WebSocket onmessage 连接为空 React-ReduxSaga
- laravel - 我的 sqlite 数据库在 laravel 中不起作用
- java - Spring(3.1.0)控制器验证不起作用
- sql - 查询选择只属于 ID 和 SUB-ID 的记录
- php - Laravel Vue 如何从 Vue 更新用户表中的列
- javascript - 在 Vue/JS 中为条件重写几个 if 循环的更好方法是什么?
- firebase - 使用没有身份验证的 admin SDK 针对本地 Firestore 模拟器编写测试
- xcode - 将 xib 添加到框架