策略 - 在打字稿中输入的字符串
Strategy - string to type in typescript
我正在使用打字稿,我想将一个字符串映射到一个类型,这样我就可以根据我拥有的字符串创建特定类型的实例。
我正在写信给 node.js
例如 - 我从数据库中得到值“range”,对于这种情况我想使用我的 class“RangeFilter”,但对于值“size”我想使用class“SizeFilter”。它们都继承自“IFilter”接口。
那么有没有办法将值映射(创建字典)到类型
所以可以这样
map: {key: string, value: IFilter};
Return new map["range"] //returns RangeFilter
有办法。
基本上你需要知道的是 class MyClass
的类型是:{ new(): MyClass }
.
那么你可以这样做:
interface IFilter {}
type FilterConstructor = { new(): IFilter };
class RangeFilter implements IFilter {}
class SizeFilter implements IFilter {}
let ctors: { [key: string]: FilterConstructor } = {};
ctors["range"] = RangeFilter;
ctors["size"] = SizeFilter;
function factory<T extends IFilter>(key: string): T {
let ctor = ctors[key];
return ctor == null ? null : new ctor() as T;
}
let rangeFilter: RangeFilter = factory("range");
我正在使用打字稿,我想将一个字符串映射到一个类型,这样我就可以根据我拥有的字符串创建特定类型的实例。
我正在写信给 node.js
例如 - 我从数据库中得到值“range”,对于这种情况我想使用我的 class“RangeFilter”,但对于值“size”我想使用class“SizeFilter”。它们都继承自“IFilter”接口。
那么有没有办法将值映射(创建字典)到类型
所以可以这样
map: {key: string, value: IFilter};
Return new map["range"] //returns RangeFilter
有办法。
基本上你需要知道的是 class MyClass
的类型是:{ new(): MyClass }
.
那么你可以这样做:
interface IFilter {}
type FilterConstructor = { new(): IFilter };
class RangeFilter implements IFilter {}
class SizeFilter implements IFilter {}
let ctors: { [key: string]: FilterConstructor } = {};
ctors["range"] = RangeFilter;
ctors["size"] = SizeFilter;
function factory<T extends IFilter>(key: string): T {
let ctor = ctors[key];
return ctor == null ? null : new ctor() as T;
}
let rangeFilter: RangeFilter = factory("range");