假设我有一个类似的界面:
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是否可以使用它已经知道的键属于目标接口并验证要传递的第二个参数的类型?
答案 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
希望有帮助。祝你好运!