【问题标题】:Allow part of a type允许类型的一部分
【发布时间】:2015-10-11 14:20:55
【问题描述】:

假设我有这样的类型

interface User {
  name: string;
  email: string;
}

还有这样的方法

updateUser(user: User) {
}

如果键入写为updateUser,则不能只传递一个名称(updateUser({name: 'Anna'} 失败),如果这是我要更新的唯一属性。

如果我在User 上将email 设为可选,这是可能的,但我不希望这样。如果有人通过了用户,他们应该能够期待该字段。 我也可以输入updateUser

updateUser(user: {name?: string, email?: string}) {
}

它会起作用,但是当User 获得新属性时,我必须重复整个用户并更新这两个地方。

有没有办法指定 updateUser 以便它允许用户对象的某些部分,但如果有人试图传递丢失或键入错误的属性,则会失败?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在这种情况下,我们总是可以使用断言 - <User> - 像这样:

    updateUser(<User>{name: 'Anna'})
    updateUser(<User>{email: 'some@anna.com'})
    

    但这实际上不是最好的方式,因为任何事情都会通过这种方式:

    updateUser(<User>{wrongProperty: 'wrong'})
    

    所以,我真的更愿意使用可空性

    interface IUser {
      name?: string;
      email?: string;
    }
    

    使用 typescript 1.6,我们可以确定这会通过

    interface IUser {
      name?: string;
      email?: string;
    }
    
    function updateUser2(user: IUser) {
    }
    // these are of type IUser
    updateUser2({name: 'Anna'})
    updateUser2({email: 'some@anna.com'})
    

    虽然不是这样:

    // this is not IUser
    updateUser2({wrongProperty: 'someValue'})
    

    在这里查看,typescript playground

    还有:What's new in TypeScript

    更严格的对象字面量赋值检查

    TypeScript 1.6 强制执行更严格的对象字面量赋值检查,以捕获多余或拼写错误的属性。具体来说,当将新的对象字面量分配给变量或传递给非空目标类型的参数时,对象字面量指定目标类型中不存在的属性是错误的。 例子

    var x: { foo: number };
    x = { foo: 1, baz: 2 };  // Error, excess property `baz`
    
    var y: { foo: number, bar?: number };
    y = { foo: 1, baz: 2 };  // Error, excess or misspelled property `baz`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-03
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2018-10-13
      相关资源
      最近更新 更多