Typescript-将对象中的新键作为通用传递

时间:2019-11-15 19:14:21

标签: reactjs typescript generics

我很好奇如何实现这种事情:

我有一些对象数组传递给图表组件,例如:

type ChartData = { label: string; value: number }[];
const data: ChartData = [{ label: "Mon", value: 3 }, { label: "Tue", value: 7 }];

但是,在某些情况下,我需要使用其他键代替value键。如何从ChartData创建泛型类型,以便将键等于将字符串传递给泛型的对象。

例如:

type ChartData<T> = { label: string; [T]: number }[];

type NewType = ChartData<"newkey">
const data: NewType = [{ label: "Mon", newkey: 3 }, { label: "Tue", newkey: 7 }]; // OK

任何想法该怎么做?甚至有可能吗?

1 个答案:

答案 0 :(得分:2)

当然,您可以这样做:

type ChartData<K extends keyof any = "value"> =
    Array<{ label: string; } & Record<K, number>>;

这使用Record<K, number> utility type,它是mapped type {[P in K]: number}的有用的类型别名。因此,您还可以使用:

type ChartData<K extends keyof any = "value"> =
    Array<{ label: string; } & {[P in K]: number}>;

以您尝试使用它的方式起作用:

const data: ChartData = [{ label: "Mon", value: 3 }, { label: "Tue", value: 7 }];

type NewType = ChartData<"newkey">
const newData: NewType = [{ label: "Mon", newkey: 3 }, { label: "Tue", newkey: 7 }];

希望有所帮助;祝你好运!

Link to code