上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

为什么Typescript的Array是双变的

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    668

    主题

    5357

    回帖

    6264

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6264

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-1-28 22:36:36 | 显示全部楼层 | 阅读模式

    前文

    首先我们知道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

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-1-31 01:38:22 | 显示全部楼层
    在学



    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    668

    主题

    5357

    回帖

    6264

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6264

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-1-31 09:06:22 | 显示全部楼层
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表