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

typescript Equal函数相等性推测

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

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2022-8-1 15:18:05 | 显示全部楼层 | 阅读模式
    type Equal<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends <
      T
    >() => T extends Y ? 1 : 2
      ? A
      : B;

    这里的

    <T>() => T extends X ? 1 : 2) extends <
      T
    >() => T extends Y ? 1 : 2

    实际只是一个辅助作用
    并没有参与实际推断
    具体可以参考
    https://github.com/Microsoft/TypeScript/issues/27024

    @jituanlin AFAIK it relies on conditional types being deferred when T is not known. Assignability of deferred conditional types relies on an internal isTypeIdenticalTo check, which is only true for two conditional types if:
    
    Both conditional types have the same constraint
    The true and false branches of both conditions are the same type

    当函数T是未知时,依赖于延迟推断类型,延迟推断类型的可分配性依赖于内部isTypeIdenticalTo的检查,仅在两种情况下为真,
    1.extends分支结果是相同类型,
    2.两个条件类型是同一类型,

    <T>() => T extends X ? 1 : 2 和 <T>() => T extends X

    时返回true,通过该方法判断类型是否是readonly

    export type MutableKeys<T extends object> = {
      [P in keyof T]-?: Equal<
        { [Q in P]: T[P] },
        { -readonly [Q in P]: T[P] },
        P,
        never
      >;
    }[keyof T];
    
    expectType<MutableKeys<{ a: string; readonly b: string }>>('a');

    但更具体的理论就不清楚了....

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

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

    发表回复

    本版积分规则

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