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

2022-07-08 09:00:57 +08:00
 makelove
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 链接

2475 次点击
所在节点    TypeScript
6 条回复
zsxeee
2022-07-08 09:29:25 +08:00
let d: unknown = ""

T 类型应该是 unknown 了
Leviathann
2022-07-08 09:50:58 +08:00
lodash 的 type 看起啦花里胡哨的一大堆,实际上经常是走到带 any 的重载,所以我都不用 lodash 了
evada
2022-07-08 10:01:42 +08:00
看起来重载是参数和返回值可以任意组合?
declare const identity3: {
(v: unknown): undefined
(): string
}
如果这样 identity3 也不会抱错
makelove
2022-07-08 10:08:47 +08:00
@evada 你这个有 string,可是 identity 根本没有 string 返回值啊?只有个 T,而 T 和 string 不相容
evada
2022-07-08 10:16:16 +08:00
就是可以这样 () => T ,() => T 和 (unknow) => T 是兼容的
makelove
2022-07-08 10:40:16 +08:00
@evada 可是 KeyGetter 需要返回一个 string 。不是参数的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864816

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX