Ben*_*Ben 4 generics service static typescript
我有一个服务,我想使用它从JSON返回指定类型的对象。
我有一个MyClass实现静态类的类,该类定义了一个FromJSON静态方法。
export interface InterfaceMyClass {
static FromJSON(json: any): any;
}
export class MyClass implements InterfaceMyClass {
constructor(){}
FromJSON(json: any): MyClass {
let instance = MyClass.create(MyClass.prototype);
Object.assign(instance, json);
// Some other code specific to MyClass
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何调用在服务中传入参数的泛型类的静态方法。我的服务如下所示:
export class MyService<T extends InterfaceMyClass> {
getObject() {
let json = getExternalJson(...);
return T.FromJSON(json); // <-- How to call static method FromJSON from T class ?
}
}
Run Code Online (Sandbox Code Playgroud)
我想这样使用服务:
let service = new MyService<MyClass>();
let myObject = service.getObject(); // <-- Should by an MyClass instance (created by MyClass.FromJSON)
Run Code Online (Sandbox Code Playgroud)
问题:
如何调用此T.FromJSON方法?
额外的问题:实现静态方法的好方法是什么?我不认为我的FromJSON方法MyClass是静态的。如果我在之前添加静态词FromJSON,它会告诉我:
[ts] Class 'MyClass' incorrectly implements interface 'InterfaceMyClass'.
Property 'FromJSON' is missing in type 'MyClass'.
Run Code Online (Sandbox Code Playgroud)
一些东西:
(1)接口不能具有静态声明,例如:
interface MyInterface {
static myMethod(); // Error: 'static' modifier cannot appear on a type member
}
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
在打字稿中解决此问题的方法是定义一个构建器/构造器接口:
interface MyInterface {}
interface MyInterfaceBuilder {
new (): MyInterface;
myMethod();
}
Run Code Online (Sandbox Code Playgroud)
(2)通用约束仅在编译时可用,但是由于javascript不支持它们,因此编译器将其删除,例如:
class MyClass<T extends string> {
private member: T;
constructor() {
this.member = new T(); // Error: Cannot find name 'T'
}
}
Run Code Online (Sandbox Code Playgroud)
编译成:
var MyClass = (function () {
function MyClass() {
this.member = new T(); // Error: Cannot find name 'T'
}
return MyClass;
}());
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
查看js输出时,很清楚为什么编译器会抛出Cannot find name 'T'错误,但T找不到地方。
为了解决所有这些问题,这里有一个解决方案:
interface IMyClass {}
interface IMyClassBuilder<T extends IMyClass> {
new (): T;
FromJSON(json: any): any;
}
class MyClass implements IMyClass {
static FromJSON(json: any) {
return "";
}
}
class MyService<T extends IMyClass> {
private classToCreate: IMyClassBuilder<T>;
constructor(classToCreate: IMyClassBuilder<T>) {
this.classToCreate = classToCreate;
}
getObject(): T {
let json = getExternalJson(...);
return this.classToCreate.FromJSON(json);
}
}
let service = new MyService(MyClass);
let myObject = service.getObject();
Run Code Online (Sandbox Code Playgroud)
(操场上的代码)
| 归档时间: |
|
| 查看次数: |
3873 次 |
| 最近记录: |