typescript - 按标准的通用工厂方法
问题描述
我想使用打字稿构建一个通用工厂方法。\
我的目标是使用泛型按名称实例化一个类,而不是使用 if/else/switch 语句。
我想实现相同的功能,例如:
document.createElement("p");
createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K];
interface HTMLElementTagNameMap {
"a": HTMLAnchorElement;
"abbr": HTMLElement;
"address": HTMLElement;
"applet": HTMLAppletElement;
...
}
我在尝试从类类型创建实例时遇到了困难:
class A {
constructor(private name:string,private id:number){
}
}
class B extends A{
}
class C extends A{
}
interface stringToClassMap{
'A':A;
'B':B;
'C':C;
}
// Need to be new instance every time
const obj: stringToClassMap = {A:new A('x',123),B:new B('x',123),C:new C('x',123)}
function creator<K extends keyof stringToClassMap>(key:K): A{
return new obj[key]();<---------------------
}
谢谢!!!
解决方案
class Y {
constructor(public a: string) {}
}
class A {
constructor(private name: string, private id: number) {}
}
class B extends A {}
class C extends Y {}
type Constructor<T> = new (...args: any) => T;
interface ClassNameMap {
A: Constructor<A>;
B: Constructor<B>;
C: Constructor<C>;
Y: Constructor<Y>;
}
// Need to be new instance every time
const obj: ClassNameMap = {
A: A,
B: B,
C: C,
Y: Y
};
function creator<K extends keyof ClassNameMap>(
key: K,
...options: any
): ClassNameMap[K] extends Constructor<infer M> ? M : never {
const Cls = obj[key];
return new Cls(...options) as any;
}
const t = creator("A", "");
const b = creator("B", "");
const c = creator("C", "");
const y = creator("Y", "");
推荐阅读
- android - 应用程序未显示存储在本地的阿拉伯语言
- typescript - 如何在类型注释中使用函数返回的类?
- django-models - 在 ListView 中编辑模型
- here-api - 如何组合 JS API URL 调用?
- azure - 是否可以使用 Azure 自动化 Runbook 删除另一个 Runbook 输出(Azure 文件共享快照)?
- angular - 如何以角度获得反应形式的价值组件?
- nativescript - 进度指示器在 android 平台 nativescript 中的 TabView 内没有停止
- c# - 如何在 MongoDB 的 Linq 查询中使用 .Contains 和 ToLower?
- react-native - React Native Pan Responder 为单个动态视图设置动画
- angular - 如何按选定值过滤数据?