想象一下对泛型类型进行操作的函数:
protected foo<T>(abc: any): T{
//[...]
let x : T = T.fromString(xyz);
//[...]
}
fromString(xyz: string)
是一个静态函数,它以某种方式将字符串转换为T
。
当然它现在不起作用,因为T类型不是值。但是,如果我知道将要代替T
的每个班级都实施fromString
方法,我该如何才能正常工作?
我考虑过创建界面:
export interface DtoSchema {
fromString<T>(data:any) : T;
}
在课堂上实施:
export class ColumnDTO implements DtoSchema {
//[...]
static fromString<T extends DtoSchema>(data: any): T {
data = typeof data === 'object' ? data : {};
let result = new ColumnDTO();
result.init(data);
return result;
}
}
我已经完成了这一点,但我不能让它发挥作用。这是我遇到的最后一个错误:
类型'ColumnDTO'不能分配给'T'
我是否正确地尝试这样做?你会如何解决它?
答案 0 :(得分:1)
这简单地回答了你问的问题。
Type 'ColumnDTO' is not assignable to type 'T'
显示错误的简化代码:
interface DtoSchema { }
export class ColumnDTO {
static fromString<T extends DtoSchema>(data: any): T {
data = typeof data === 'object' ? data : {};
let result = new ColumnDTO();
result.init(data);
return result; // ERROR: Type 'ColumnDTO' is not assignable to type 'T'
}
init(data: any) {
}
}
修复返回类型注释以匹配您返回的内容:
interface DtoSchema { }
export class ColumnDTO {
static fromString<T extends DtoSchema>(data: any): ColumnDTO { // FIX!
data = typeof data === 'object' ? data : {};
let result = new ColumnDTO();
result.init(data);
return result; // No error!
}
init(data: any) {
}
}