TypeScript-使用keyof时验证与键关联的值正确

时间:2019-01-30 19:51:14

标签: typescript

假设我有一个类似的界面:

interface Foo {
  description: string;
  amount: number;
}

还有一个更新Foo的函数,例如:

public updateFoo(key: keyof Foo, val: string | number): void {
  this.foo = { ...foo, [key]: val }
}

当我在TypeScript中调用此函数时,显然可以认为这是有效的:

this.updateFoo('description', 10)

TypeScript是否可以使用它已经知道的键属于目标接口并验证要传递的第二个参数的类型?

1 个答案:

答案 0 :(得分:2)

是的,您要使用generic function

 public updateFoo<K extends keyof Foo>(key: K, val: Foo[K]): void {        
    this.foo = { ...this.foo, [key]: val };
    // or just this.foo[key] = val;
  }

key参数是约束为K的通用类型keyof Foo,而val参数是lookup type Foo[K],表示“ Foo的属性类型,其键的类型为K”。这样,您就可以进行所需的类型安全属性的获取和设置。

现在,如果您尝试执行有问题的代码,则会收到错误消息:

this.updateFoo('description', 10) // error, 10 not assignable to string

希望有帮助。祝你好运!