代码之家  ›  专栏  ›  技术社区  ›  Shorn

Typescript:可选字段和未定义的并集有什么区别?

  •  28
  • Shorn  · 技术社区  · 8 年前

    (A) :

    interface State {
      userDetails: undefined | string | DataStructure | Error;
    }
    

    (B) :

    interface State {
      userDetails?: string | DataStructure | Error;
    }
    

    强制我将字段显式设置为未定义,如下所示:

    static readonly initialAppState: AppState = {
      userDetails: undefined
    };
    

    但是有 (B)

    static readonly initialAppState: AppState = { };
    

    如果我在使用定义时尝试省略字段 (A) Typescript会抱怨说:

    Property 'userDetails' is missing in type
    

    (A) ? 在初始化时强制执行不同要求的两个定义之间有什么不同?


    编辑 :如果您发现这个问题和下面的答案有趣或相关,您可能想知道TypeScript在v4.4中正在更改以添加 --exactOptionalPropertyTypes 旗帜这个新标志现在将导致一些原始代码出现错误,这促使我提出这个问题。

    1 回复  |  直到 5 年前
        1
  •  27
  •   Samuel Neff    8 年前

    即使在运行时,具有未定义值的键和不存在的键之间也存在差异。TypeScript允许区分并不奇怪。

    Object.keys({a: undefined});
    

    如果离开 a 将其价值设定为 undefined

    [ 'a' ]
    
    推荐文章