declare type KeyGetter = (obj: unknown) => string // 取自 lodash declare const identity: { <T>(value: T): T (): undefined } declare onst identity2: { <T>(value: T): T } declare const identity3: { (): undefined } let a: KeyGetter = identity // 为啥没报错?!类型不安全了吧 let b : KeyGetter = identity2 // 正常报错 let c: KeyGetter = identity3 // 正常报错
第一个 identity 类型是什么意思?不是一个重载吗?
1 zsxeee 2022-07-08 09:29:25 +08:00 let d: unknown = "" T 类型应该是 unknown 了 |
2 Leviathann 2022-07-08 09:50:58 +08:00 lodash 的 type 看起啦花里胡哨的一大堆,实际上经常是走到带 any 的重载,所以我都不用 lodash 了 |
3 evada 2022-07-08 10:01:42 +08:00 看起来重载是参数和返回值可以任意组合? declare const identity3: { (v: unknown): undefined (): string } 如果这样 identity3 也不会抱错 |
![]() | 4 makelove OP @evada 你这个有 string,可是 identity 根本没有 string 返回值啊?只有个 T,而 T 和 string 不相容 |
5 evada 2022-07-08 10:16:16 +08:00 就是可以这样 () => T ,() => T 和 (unknow) => T 是兼容的 |