首页 > 解决方案 > 检查 value 是否是类型的任何字段

问题描述

在 TypeScript 中,我经常遇到这样一种情况,即我有一个对象的接口:

interface MyType {
  property1: string
  property2: string
}

当我做这样的事情时:

const handleAction = (key: string, value: string) => {
  const myObject: MyType = {property1: "a", property2: "b"}
  myObject[key] = value
}

我得到一个错误No index signature with a parameter of type 'string' was found on type 'MyType'

我知道我可以将函数输入声明为key: propert1 | property2,但这很烦人,而且我可能拼写错误。

是否有可能在 TypeScript 中以某种方式指示key: any_field_of_MyType

标签: typescript

解决方案


keyof MyType用于参数的类型:

interface MyType {
  property1: string
  property2: string
}

const handleAction = (key: keyof MyType, value: string) => {
// −−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^
  const myObject: MyType = {property1: "a", property2: "b"}
  myObject[key] = value
}

游乐场链接

keyof在手册中高级类型页面的各个部分进行了描述和讨论。

您还可以使用泛型派生value's 类型:MyType

const handleAction = <Key extends keyof MyType>(key: Key, value: MyType[Key]) => {
  const myObject: MyType = {property1: "a", property2: "b"}
  myObject[key] = value
}

这对于值的类型变化而不仅仅是存在的接口更有用string,但是...... (感谢Aleksey L.指出泛型如何使其正常工作!)

游乐场链接


推荐阅读