typescript - 传递泛型类型的实例»按原样«
问题描述
考虑这个导致编译错误的示例代码:
interface Options<T extends string> {
name: T
}
class A<T extends string> {
constructor(readonly options: Options<T>){};
}
class B {
constructor(readonly a: A) {}
// Error ~ Generic type 'A<T>' requires 1 type argument(s).
}
const
a = new A<'test'>({ name: 'test' }),
b = new B(a)
;
有没有办法告诉打字稿,通用类型a: A
应该a
是创建的那个?
我试图在这里遵循依赖注入模式。因此我需要»传递创建的实例a
«,包括它的通用设置。
我想我在这里扰乱了一些 OOP 概念,并试图获得一些在概念层面上没有意义的东西,但如果不是,那么解决这个问题的最佳方法是什么,
解决方案
由于Class A<T extends string>
具有通用参数,因此您需要指定它。您可以为泛型参数定义默认值以修复编译时错误。
class A<T extends string = string>
有没有办法告诉打字稿, a: A 的泛型类型应该是创建 a 的那个?
由于参数在运行时传递给 B 的构造函数,因此打字稿编译器无法识别泛型类型。(注:编译后没有任何泛型类型)
打字稿代码
interface Options<T extends string> {
name: T
}
// If T is not specified then T = string
class A<T extends string = string> {
constructor(readonly options: Options<T>){};
}
class B {
constructor(readonly a: A) {}
}
const
a = new A<'test'>({ name: 'test' }),
b = new B(a)
;
编译代码
var A = /** @class */ (function () {
function A(options) {
this.options = options;
}
;
return A;
}());
var B = /** @class */ (function () {
function B(a) {
this.a = a;
}
return B;
}());
var a = new A({ name: 'test' }), b = new B(a);
更新
只是使class B
也通用。编译器将根据需要选择类型。
interface Options<T extends string> {
name: T
}
class A<T extends string> {
constructor(readonly options: Options<T>){};
}
class B<T extends string> {
constructor(readonly a: A<T>) {}
}
const
a = new A<'test'>({ name: 'test' }),
b = new B(a)
;
谢谢!
推荐阅读
- elasticsearch - Elasticsearch:如何添加“created_at”和“updated_at”时间戳?
- sql - 如何通过 SQL 中的批处理脚本命令执行 SQL 脚本?
- java - 我如何贴标签
- c# - 无法在 C# 中向 GRID 面板添加不同的控件
- javascript - 我怎样才能在fullcalendar中显示超过标题
- java-9 - 是否可以使用 jvm 模式使用 prunsrv 启动 Java 运行时映像?
- ios - 当应用程序即将被卸载或更新时,Cordova 中是否有事件?
- java - 为什么直接绘制像素比在 BufferedImage 中绘制数据要慢?
- php - 有没有办法重复 li 类“x”次?
- android - 时间戳的整个小时?