卧槽了 TypeScript 真不是一般人能完全驾驭的,太微妙了,这里的写法搞不懂有什么不对的

2021-10-17 12:44:48 +08:00
 makelove

写了一个复杂的函数定义,怎么搞里面的类型都是 unknown,我把问题部分最简化成这样:

Playground 链接

declare function create<A>(def: {
  a: () => A
  b: (a: A) => void
}): A

let s = create({
    a: () => { return { result: () => 'ok' } },
    b: (a) => {},
})

let s2 = create({
    a: () => { return { result() { return 'ok' } } },
    b: (a) => {},
})

你看这个 s 和 s2 定义是几乎一样的吧,一个出来是正常的类型 { result: () => "ok"; } 另一个是unknown。 谁知道这里到底有什么微妙的东西的里面?

js 怎么搞就这么点东西没有不明明白白的,ts 有时候真抓狂。

6675 次点击
所在节点    TypeScript
46 条回复
makelove
2021-10-18 12:44:12 +08:00
@thtznet C#我只会一点,java 以前写过二年,但 TS 的类型能力全面吊打 java 和 c#是没有疑问的,大量 java/c#搞不定的类型设计 ts 就可以,可能是因为 js 的灵活性所以 ts 也只能这么灵活。平时碰到疑难杂证的可能还是很少的,js 社区这么快全面拥抱 ts 不是没有道理的,编程效率提高太多了
thtznet
2021-10-18 13:03:17 +08:00
@makelove 听你这么说,那我还是试试看
zbinlin
2021-10-18 21:56:26 +08:00
@makelove 哪里改变位置参数可以同时推?
makelove
2021-10-19 09:49:05 +08:00
@zbinlin 现在 a,b 是对象参数,去掉{}改成位置的。改成位置的后,怎么写复杂的都能正确推导。
zbinlin
2021-10-19 10:03:25 +08:00
@makelove

declare function create<A>(a: () => A, b: (a: A) => void): A

这样吗?这样不是分开了呀

不过这个可能还真是个 bug 😂
conateri
2022-09-01 22:20:07 +08:00


declare function create<S, M, A>(def: {
data: S
a: (data: S) => M
b: (m: M) => void
}): M

const s = create({
data: 0,
a: (data) => 100,
b: (m) => {}
})

[playground]( https://www.typescriptlang.org/play?ts=4.7.4#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXzDigxAB4BlAGngFlqBBAPgApREAueAbwCh55gxKJ3J94w+KyEiAlPAC8jWmIBGnZgFtONOYvgA3HFmA8AvjO08eYPAGcM8WwoJESzXv0EYJABkpiJKW9dJQBGHz9VdQ0Q7lMzGSA)

4.7.4 版本可以把 s 正确推断为 number, 是 bug 没错了

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

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

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

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

© 2021 V2EX