李恒道 发表于 2023-1-28 22:36:36

为什么Typescript的Array是双变的

# 前文
首先我们知道TypeScript ESLint存在一个method-signature-style规则
函数的声明分为property以及method两种
```
interface method{
    func():void
}
interface property{
    property:()=>void
}
```
property在严格模式下会由双变改为逆变检查
但是method模式不会
查阅资料得知为了兼容诸如Array的一些类型
如果进行逆向检查,我们可以声明两个类型测试一下
假设有一个Dog是Animal的子类,Animal是基类
Dog继承Animal
那Dog[]是否继承于Animal
不光需要比较类
还需要比较类的函数,此处来自于林不度的小册
如push函数,
Dog的push函数类型推断参数是Dog
Animal的push函数类型推断参数是Animal
此时出现了Dog-》void 继承于Animal-》void才可以符合继承规则
由参数逆变定律可以知道,这里违反了逆变的规则,此处是一个协变
所以为了规避Array赋值需要协变的问题,规避的method的严格检测
但是问题来了,为什么一定要规避?而不是直接禁止变化才是更符合安全性的呀?
关于这个问题找到了https://stackoverflow.com/questions/60905518/why-are-typescript-arrays-covariant
简略翻译如下
# 为什么TS的数组是协变的?
数组的协变是不合理的,可能会导致运行时出错,Typescritp的目标排除的条例之一是
应用一个健全的和可证明正确的类型系统,相反,在正确性和生产力之间取得平衡
这意味如果某些不那么正确的语言特性非常有用,如果要求正确反而会使人开发的时候非常痛苦,那么他很可能保留下来,尽管依然存在潜在的陷阱
显然,试图保证一种主要目的为描述JS的语言的健壮性是极其愚蠢的
因为JS 运行时行为极不利于生成可用的健壮类型系统
https://github.com/microsoft/TypeScript/issues/9825#issuecomment-306272034

bigonion 发表于 2023-1-31 01:38:22

在学



李恒道 发表于 2023-1-31 09:06:22

bigonion 发表于 2023-1-31 01:38
在学




加油~
页: [1]
查看完整版本: 为什么Typescript的Array是双变的