我有一个包含多种类型值的对象:
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]
可以是string
,number
或FooData
对象,因此我想指定foo[key]
将仅是字段值Foo
的键与fooKeys
中的键匹配,因为它们都是字符串值。
我们可以断言foo[key] as string
,但这不能保护我们免受fooKeys中的错误键的伤害。
答案 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])
});
答案 1 :(得分:1)
This answer I found提到as const
:
const fooKeys = ["username", "notes"] as const;