typescript - 如何确保类的参数类型实现接口
问题描述
我有一个实现接口的类IField
export class FieldImplementation implements IField { };
还有一个存储类型的服务:
import { FieldImplementation } from '../component';
...
service.addField(FieldImplementation);
我需要确保传递给addField
implements的参数IField
。
目前addField
看起来像这样:
addField(field: any) {
...
}
解决方案
您正在寻找构造函数签名,也称为“可更新”类型。您希望参数addField()
成为您调用new
以获取IFIeld
. 可以这样表示:
addField(field: new(...args: any[])=>IField) {
// ...
new field(/* some kind of arguments */);
}
该签名将接受任何生成 的构造函数IField
,但可能与构造函数接受的参数不匹配。
如果您期望field
使用new
特定数量和类型的参数调用,您也可以表达这一点。例如,如果你想field
成为一个无参数的构造函数:
addField(field: new()=>IField) {
// ...
new field(); // no arguments
}
然后,如果FieldImplementation
是一个具有无参数构造函数的类,它将成功:
service.addField(FieldImplementation); // okay
而需要构造函数参数的类将失败,这很好:
class NeedAString implements IField {
constructor(private myString: string) { }
};
service.addField(NeedAString); // error, NeedAString is not a no-arg constructor
// error is desirable because you don't want addField() implementation
// to call new NeedAString();
希望有帮助。祝你好运!
推荐阅读
- ffmpeg - 我如何在 ffmpeg 中连接 3 个视频
- php - Tinymce 插件没有获取要上传到数据库的 textarea 值
- python - 如果一个列表中的数字在另一个列表中相同,则 Python 返回结果
- mysql - 从 JOIN Shows #1064 更新表
- c++ - 为什么opengl中的gl_FragColor与Colorbuffer不同?
- ruby-on-rails - 使用 Rails 使用 SendGrid 将附件添加到电子邮件
- java - Java 子字符串跳过最后两个分隔符字符串
- php - 使 Laravel 的 notIn 验证规则不区分大小写
- java - 每次我扩展一个类并需要触发它的构造函数时,我是否必须调用 super ?
- sql - 从 Unix 时间戳中减去小时数