为啥这个变量的类型和预期的不一样??

2019-10-18 21:19:16 +08:00
 love
const a: number[] = []
const next: number | undefined = a[1]
const x = next

查看 Playground

这里 x 的类型是 number,怎么不是 number | undefined ?

我的意思是表示从数组中取一个值,它可能是 undefined,有什么标准写法?

3292 次点击
所在节点    TypeScript
5 条回复
rekey
2019-11-23 16:13:27 +08:00
自动推导出 x 是 a[1]
a 是 number[] 那 a[1] 是啥?
weakish
2019-12-07 00:00:01 +08:00
其实 next 你如果不注解的话,ts 自动推导的结果也是 `number`。所以你这里需要给 `x` 也加注解。

之所以 ts 这里的类型直接推断为 number 是因为从数组中取一个值太常见了,给它开了后门,可以看 Anders Hejlsberg 本人的发言 aHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvNzE0MCNpc3N1ZWNvbW1lbnQtMTkyNjcwNDUz (抱歉我不能直接贴 url,因为我的 V2EX 账号没绑手机,请自行转换一下)
love
2019-12-07 21:42:33 +08:00
@weakish 后来发现这个倒是不关数组的问题

const next: number | undefined = 100
这里 next 的类型实际上不是声明里指定的 number | undefined,而是 number
和别的静态类型语言如 java 概念不一样,这个不太好理解上去。
chnwillliu
2020-02-08 00:02:10 +08:00
@love 不是的呀,你没开 strictNullChecks,所以 null 和 undefined 是所有类型的子类型,也就是说变量 next 是 number 类型隐含了它可能为 undefined。
love
2020-02-08 10:00:15 +08:00
@chnwillliu
开启时 next 也是 number 没有带 undefined

const next: number | undefined = 100 as any
const x: number = next
const y: number | undefined = next
这里 x 会报错。

const next: number | undefined = 100
const x: number = next
const y: number | undefined = next
这里不报错。

这个类型声明没什么用,看的是右边是啥类型。

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

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

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

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

© 2021 V2EX