【发布时间】:2022-01-14 19:21:09
【问题描述】:
考虑以下示例:
type columns = {
A: number;
B: string;
C: boolean;
};
const mapper: { [T in keyof columns]: (item: columns[T]) => string } = {
A: item => `${item}`,
B: item => item,
C: item => (item ? "Good" : "Bad"),
};
const data: columns[] = [
{ A: 0, B: "Hello", C: true },
{ A: 1, B: "World", C: false },
];
const keys: (keyof columns)[] = ["A", "B", "C"];
data.map(item => keys.map(key => mapper[key](item[key] as never)));
// should return [["0", "Hello", "Good"], ["1", "World", "Bad"]]
在最后一行,key 的类型为keyof columns,即"A" | "B" | "C",这使得mapper[key] 减少为(item: number & string & boolean) => string,即(item: never) => string。 (如果我的概念是错误的,请指出。)
所以问题是,我怎样才能重写代码,使item[key] 不需要转换为never?
【问题讨论】:
-
类型名称通常用 UpperPascalCase 编写,所以我在回答中将
columns切换为Columns。此外,键类型的类型参数更传统地命名为K(用于键)或P(用于属性),因此我在答案代码中也将T in keyof columns切换为K in keyof Columns。
标签: typescript types type-inference