1
xlsepiphone 2021-09-17 17:11:14 +08:00
语法上如何判断呢?
|
2
number 2021-09-17 17:14:06 +08:00
能否举个开启前和开启后的栗子
|
3
learningman 2021-09-17 17:18:12 +08:00 via Android
Object.hasOwnProprietor
|
4
learningman 2021-09-17 17:18:21 +08:00 via Android
Property
|
5
xlsepiphone 2021-09-17 17:29:28 +08:00
```typescript
// With 'exactOptionalPropertyTypes' on: const p: Person = { name: "Daniel", age: undefined, // Error! undefined isn't a number }; ``` |
6
EPr2hh6LADQWqRVH 2021-09-17 17:37:07 +08:00
搞错了,是人的问题。
这个选项可有可无,我个人觉得没有更好一点。 都已知存在这个字段了,还非得掩耳盗铃假装它不存在,不能给他设置成 undefined, 那怎么办,只能 delete 他? 手动设置一个 undefined 可选项? 这两个都比现在的方式更麻烦更不可读。 |
7
Leviathann OP @number
@xlsepiphone 开启后可以判断一个 obj 是没有字段还是字段的值为 undefined, 如果不开,当你遍历这个 obj 的 entries 的时候,如果定义的时候使用的是 {propertyName?: string | number } 编译器不会告诉你这个 value 可能是 undefined 开了以后就能识别出来 type A = { name?: string } const a: A = { name: undefined } // error |
8
maichael 2021-09-17 18:23:32 +08:00
@avastms #6
"Functions and operators like Object.assign, Object.keys, object spread ({ ...obj }), and for–in loops behave differently depending on whether or not a property actually exists on an object." 基于官方的说法,这个场景更多针对于下面这类的用法: const a = {b:1, c:undefined} object.keys(a) // ['b', 'c'] const b = {b:1} object.keys(b) // ['b'] 当然,意义确实不大。 |
9
pkoukk 2021-09-17 18:43:36 +08:00
是啥情况下需要传值为 undefined 呢?想传空应该传 null 吧
|
10
Leviathann OP @pkoukk
就是比如说有一个 react component 的属性 name,定义是 {name?: string},不传的时候就自然是 undeifined,然后用这个属性的字面量简写构建了一个对象 const obj = {name} 把这个 obj 传给一个接收参数类型为 {params: {name?: string}} 的函数,然后函数直接 Object.entries.map(([key, value]) => xxx) 然后由于不开这个选项,value 就没有告诉他可能是 undefined,结果我用的时候也没注意到,然后还得帮他改 bug 。。 |
11
iugo 2022-04-23 09:26:42 +08:00
在运行时上有意义, 但在编译时上意义没那么大.
在运行时上的意义比如 Object.keys() 时的结果. |