允许部分类型

时间:2015-10-11 14:20:56

标签: typescript

说我有这样的类型

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

和这样的方法

updateUser(user: User) {
}

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

如果我在emailUser可选,则可以,但我不想这样做。如果有人通过用户,他们应该能够期待该字段。 我也可以输入updateUser作为

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

它会起作用,但我必须重复整个用户并在User获得新属性时更新这两个位置。

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

1 个答案:

答案 0 :(得分:0)

在这种情况下,我们总是可以使用断言 - <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`