如何键入 smart 以仅允许类属性的键作为打字稿中的方法参数

时间:2021-04-14 12:46:29

标签: typescript

如何为 setProperty 方法“key”和“value”的参数添加类型 是否有更多的动态方式而不是 string 或只是添加所有可能的类型,例如 'name' | 'age' | 'sex' 以使其更具可扩展性。

class Person {
   name: string;
   age: number;
   sex: 'men' | 'women'

   setProperty(key: string, value: any): Person {
      this[key] = value
      return this
   }
}

1 个答案:

答案 0 :(得分:3)

您可以使用 key 类型来确定 value 的可用值,甚至是 keyof 该属性名称的类型:

class Person {
   name?: string;
   age?: number;
   sex?: 'men' | 'women'

   setProperty<K extends keyof Person>(this: Person, key: K, value: Person[K]): Person {
      this[key] = value
      return this
   }
}

const p = new Person();
p.setProperty('name', 'John Smith');  // fine
p.setProperty('age', 40);  // fine
p.setProperty('sex', 'foo');  // not fine

Playground

如果您不希望 setProperty 可重新分配(这似乎很可能),您可以改用 keyof Omit<Person, 'setProperty'>