【问题标题】:TypeScript - validate that value associated with a key is correct when using keyofTypeScript - 使用 keyof 时验证与键关联的值是否正确
【发布时间】:2019-06-24 04:47:46
【问题描述】:

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

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 有没有办法使用它已经知道属于目标接口的键并验证传递的第二个参数的类型?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    是的,您想使用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 Fooval 参数是lookup type Foo[K],意思是“Foo 的属性类型,其键为类型为K"。这使您可以进行所需的类型安全属性获取和设置。

    现在如果你尝试有问题​​的代码,你会得到一个错误:

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

    希望对您有所帮助。祝你好运!

    【讨论】:

    • 我不说this.foo[key] = val 的原因是为了避免突变,我实际上并没有直接访问 foo 属性,这只是为了简洁。我从来不知道Foo[K] 是有效的语法,这太棒了。
    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2013-09-18
    • 1970-01-01
    • 2021-12-09
    • 2011-04-25
    相关资源
    最近更新 更多