V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
makelove
V2EX  ›  TypeScript

谁能解释一下为什么这条 TypeScript 离谱地没有报错?

  •  
  •   makelove · 2022-07-08 09:00:57 +08:00 · 2484 次点击
    这是一个创建于 879 天前的主题,其中的信息可能已经有所发展或是发生改变。
    declare type KeyGetter = (obj: unknown) => string
    
    // 取自 lodash
    declare const identity: {
      <T>(value: T): T
      (): undefined
    }
    
    declare const identity2: {
      <T>(value: T): T
    }
    
    declare const identity3: {
      (): undefined
    }
    
    let a: KeyGetter = identity // 为啥没报错?!类型不安全了吧
    let b : KeyGetter = identity2 // 正常报错
    let c: KeyGetter = identity3 // 正常报错
    

    第一个 identity 类型是什么意思?不是一个重载吗?

    PlayGround 链接

    6 条回复    2022-07-08 10:40:16 +08:00
    zsxeee
        1
    zsxeee  
       2022-07-08 09:29:25 +08:00
    let d: unknown = ""

    T 类型应该是 unknown 了
    Leviathann
        2
    Leviathann  
       2022-07-08 09:50:58 +08:00
    lodash 的 type 看起啦花里胡哨的一大堆,实际上经常是走到带 any 的重载,所以我都不用 lodash 了
    evada
        3
    evada  
       2022-07-08 10:01:42 +08:00
    看起来重载是参数和返回值可以任意组合?
    declare const identity3: {
    (v: unknown): undefined
    (): string
    }
    如果这样 identity3 也不会抱错
    makelove
        4
    makelove  
    OP
       2022-07-08 10:08:47 +08:00
    @evada 你这个有 string,可是 identity 根本没有 string 返回值啊?只有个 T,而 T 和 string 不相容
    evada
        5
    evada  
       2022-07-08 10:16:16 +08:00
    就是可以这样 () => T ,() => T 和 (unknow) => T 是兼容的
    makelove
        6
    makelove  
    OP
       2022-07-08 10:40:16 +08:00
    @evada 可是 KeyGetter 需要返回一个 string 。不是参数的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1209 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 18:16 · PVG 02:16 · LAX 10:16 · JFK 13:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.