typescript - 调用泛型类型的静态函数
问题描述
想象一个对泛型类型进行操作的函数:
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”
我是否试图正确地做到这一点?你会如何解决它?
解决方案
这只是回答了您提出的问题。
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) {
}
}
推荐阅读
- roblox - 如何在 roblox 中制作一个工作团队更换器 GUI?
- utf-8 - 了解 LC_ALL=C 及其对标准英文字符的影响
- docker - 无法通过 docker-compose 文件使用 Docker Swarm 将 neo4j 服务部署为 docker 堆栈
- django - 交易永远不会被挖掘,使用 web3.py
- javascript - 这是什么类型的 XSS 以及如何防止它
- php - 无论 NGINX 状态码如何,PHP-FPM 总是返回 200
- javascript - 简单的 JQuery 函数在表单提交后不会执行
- java - 我如何让我的新值通过 if 语句返回
- php - 致命错误:未捕获的错误:调用未定义的方法 Facebook\Facebook::getUser()
- java - 使用集合和 HashMap