V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Leviathann
V2EX  ›  TypeScript

才知道原来 typescript 最近(4.4.0)才支持区分一个属性不存在还是属性的值为 undefined

  •  
  •   Leviathann · 70 天前 via iPhone · 654 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。
    然后就碰到这个点导致的 bug 。。
    多少年了终于能够在编译器发现这个问题,我只能说 thanks for inventing Javascript

    如果有同样需要的朋友可以在 tsconfig 里加
    “exactOptionalPropertyTypes”: true,
    10 条回复    2021-09-17 19:16:07 +08:00
    xlsepiphone
        1
    xlsepiphone   70 天前
    语法上如何判断呢?
    number
        2
    number   70 天前
    能否举个开启前和开启后的栗子
    learningman
        3
    learningman   70 天前 via Android
    Object.hasOwnProprietor
    learningman
        4
    learningman   70 天前 via Android
    Property
    xlsepiphone
        5
    xlsepiphone   70 天前
    ```typescript
    // With 'exactOptionalPropertyTypes' on:
    const p: Person = {
    name: "Daniel",
    age: undefined, // Error! undefined isn't a number
    };
    ```
    avastms
        6
    avastms   70 天前
    搞错了,是人的问题。

    这个选项可有可无,我个人觉得没有更好一点。

    都已知存在这个字段了,还非得掩耳盗铃假装它不存在,不能给他设置成 undefined,
    那怎么办,只能 delete 他?
    手动设置一个 undefined 可选项?
    这两个都比现在的方式更麻烦更不可读。
    Leviathann
        7
    Leviathann   70 天前
    @number
    @xlsepiphone

    开启后可以判断一个 obj 是没有字段还是字段的值为 undefined,
    如果不开,当你遍历这个 obj 的 entries 的时候,如果定义的时候使用的是 {propertyName?: string | number } 编译器不会告诉你这个 value 可能是 undefined

    开了以后就能识别出来
    type A = { name?: string }
    const a: A = { name: undefined } // error
    maichael
        8
    maichael   70 天前
    @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']

    当然,意义确实不大。
    pkoukk
        9
    pkoukk   70 天前
    是啥情况下需要传值为 undefined 呢?想传空应该传 null 吧
    Leviathann
        10
    Leviathann   70 天前
    @pkoukk
    就是比如说有一个 react component 的属性 name,定义是 {name?: string},不传的时候就自然是 undeifined,然后用这个属性的字面量简写构建了一个对象
    const obj = {name}
    把这个 obj 传给一个接收参数类型为 {params: {name?: string}} 的函数,然后函数直接
    Object.entries.map(([key, value]) => xxx)
    然后由于不开这个选项,value 就没有告诉他可能是 undefined,结果我用的时候也没注意到,然后还得帮他改 bug 。。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1040 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:01 · PVG 07:01 · LAX 15:01 · JFK 18:01
    ♥ Do have faith in what you're doing.