typescript - Typescript - 为什么没有相应地强制实现接口
问题描述
我想知道为什么实现两次相同的通用接口但使用不同的参数并不能在派生类中强制执行正确的签名。泛型参数的类型被省略。
请看样例:
interface IEvent { id: number; }
interface IHandle<T> {
handle(event: T): void;
}
class EmailSentEvent implements IEvent {
constructor(public id: number, public address: string) {}
}
class UserRegisteredEvent implements IEvent {
constructor(public id: number) {}
}
class MailHandlerState implements
IHandle<EmailSentEvent>,
IHandle<UserRegisteredEvent>
{
// One implementation is enough to satisfy both interfaces
handle = (event: EmailSentEvent): void => {
};
}
有没有办法强制执行两个泛型参数?谢谢!
解决方案
TLDR:
为了使这项工作,改变方法符号
interface IHandle<T> {
handle(event: T): void;
}
具有函数类型的属性
interface IHandle<T> {
handle: (event: T) => void;
}
** 在这种特定情况下,实现仍然可以使用方法语法
事实证明这是按预期工作的:
--strictFunctionTypes
以逆变方式而不是双变量方式检查函数类型参数位置的模式。更严格的检查适用于所有函数类型,但源自方法或构造函数声明的函数类型除外。专门排除方法以确保泛型类和接口(例如 Array)继续主要以协变方式相关。严格检查方法的影响将是一个更大的突破性变化,因为大量泛型类型将变得不变(即便如此,我们可能会继续探索这种更严格的模式)
手册中也有
推荐阅读
- java - 我需要从存储在我的 res/drawables 中的图像中将图像设置到我的 ImageView
- ios - 设置表格视图编辑附件的背景颜色
- laravel - 多对多检索书籍和作者姓名错误 laravel
- java - 使用 JDBC 和 JSP 进行登录验证:如何检查用户输入的用户名和密码是否存在于数据库中?
- emacs - 在 Emacs 中使用 SLIME 时:如何重置 swank-loader.lisp 的路径?
- azure - Azure 数据工厂:所有活动之前/之后的通用逻辑
- flutter - 在颤动中设置父状态时,计时器不会重置
- javascript - 您应该考虑开关中的 1 值吗?
- c++ - 为什么 bin_to_dec() 返回 0?
- php - codeigniter - php - 不插入数据库