如何使用特定的键子集键入对象字段的值?

时间:2019-09-16 17:54:48

标签: javascript reactjs typescript types

我有一个包含多种类型值的对象:

interface Foo {
  id: number;
  data: FooData;
  username: string;
  notes: string;
}

const foo: Foo = {
  ...
}

我有一个需要字符串的函数,并遍历对象中要在该函数中使用的特定字段列表,所有这些字段都包含字符串值:

const renderString = (value: string) => {
  ...
}

const fooKeys: keyof Foo = ["username", "notes"];

fooKeys.map((key) => {
  renderString(foo[key])
}

问题在于foo[key]可以是stringnumberFooData对象,因此我想指定foo[key]将仅是字段值Foo的键与fooKeys中的键匹配,因为它们都是字符串值。

我们可以断言foo[key] as string,但这不能保护我们免受fooKeys中的错误键的伤害。

2 个答案:

答案 0 :(得分:2)

一个选择是使用条件类型仅允许string属性,因为这似乎是唯一允许的属性?例如:

type StringPropsOnly<T> = {
  [Key in keyof T]: T[Key] extends string ? Key : never;
}[keyof T]

const fooKeys: StringPropsOnly<Foo>[] = ["username", "notes"];

fooKeys.map((key) => {
  renderString(foo[key])
});

TypeScript Playground

答案 1 :(得分:1)

This answer I found提到as const

const fooKeys = ["username", "notes"] as const;