请教一个 ts 的问题

2023-09-09 23:28:19 +08:00
 zbzzhh

type withString = String

type withNumber = Number

type emptySet = withString & withNumber

此时 emptySet 的类型是 never

那请问下图为何类型 a 跟 b 是有相交的部分?我理解是 never 。

3727 次点击
所在节点    JavaScript
25 条回复
TunkShif
2023-09-10 17:47:20 +08:00
假定有 type A = { foo: string }, type B = { bar: string }, type C = A & B, const obj = { foo: "foo", bar: "bar" }
那么 let a: A = obj, let b: B = obj, let c: C = obj 都是成立的
即 obj 这个值的类型既可以是 A ,也可以是 B ,还可以是 C ,[TS Playground]( https://www.typescriptlang.org/play?#code/C4TwDgpgBAglC8UDeAoKUBmB7LAuKAzsAE4CWAdgOYoC+KKokUAQgsmlAEYCGx+RZKrXqNoAYTZwAZC3oBjLOSJQsnAFZtU6bHigAiHXoA0HHn31njp7gC98enjb3CUAGwjAo3fHESq1bh5c+Kx+6oGecvgSYWpAA)
因为 TypeScript 的类型系统是 [structural typing]( https://www.typescriptlang.org/play#example/structural-typing) 的,类型 type A = { foo: string } 并不是表示仅有 foo 这一个属性的对象才属于该类型,而是表示只要某对象含有 foo 这一个属性便属于该类型
所以属于类型 A 的值为含有 foo 属性的全体对象,属于类型 B 的值为含有 bar 属性的全体对象,那么属于 A 和 B 的交集类型的值则为同时含有 foo 和 bar 属性的全体对象
mingdongshensen
2023-09-10 18:35:38 +08:00
你的情况是原始类型,不同原始类型之间一般都是互斥的,但截图同为对象类型,可以同时满足
Belmode
2023-09-10 20:32:40 +08:00
GPT 是这么回复的
kayanouriko
2023-09-10 20:41:55 +08:00
感谢 op 提的这个问题, 根据楼上的回复搜了一下关键词 ( 结构类型系统 / Structural Type System ) 扩展了知识面.
PTLin
2023-09-10 21:06:36 +08:00
系统自带的,非用户结构化定义的类型需要特殊的去记对应的规则,类似的还有 keyof any = string | number | symbol

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

https://ex.noerr.eu.org/t/972362

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

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

© 2021 V2EX