代码之家  ›  专栏  ›  技术社区  ›  Jeremy Chone

为什么对对象文本和变量的类型强制不同?

  •  2
  • Jeremy Chone  · 技术社区  · 6 年前

    我想了解为什么在对象文本和变量之间应用/强制执行TypeScript类型是不同的。

    interface User {
        id: number;
    }
    
    function p(u: User) { }
    
    const u1 = { id: 123 }
    
    const u2 = { id: 124, foo: 'bar' };
    
    p(u1); // << Works as expected
    
    p({ id: 124, foo: 'bar' }); // << ERROR as expected:  ' Object literal may only specify known properties'
    
    p(u2); // << NO ERROR??
    
    // workaround
    const u3: User = { id: 124, foo: 'bar' }; // << ERROR as expected
    

    解决方法是可以的,但是这种不对称可能会导致意想不到的行为,开发人员需要进行严格的部分检查,才能意识到其他属性是允许的。

    我相信这是有原因的,我很想知道原因。

    1 回复  |  直到 6 年前
        1
  •  4
  •   kingdaro    6 年前

    Here's a part from the handbook which talks about this. 总结一下我所能做到的:检查对象文本是否有多余属性(而不是“传递”对象)的原因是,当处理像options对象这样的对象(这是一种非常常见的模式)时,多余的属性通常是打字错误或其他类型错误的结果。