typescript 从对象值强制对象键的类型脚本

inkz8wg9  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(142)

我想创建一个类型,其中对象键是来自对象值的值。
示例:

type AreaChartData = {
  xAxis: string;
  yAxis: string;
  data: {
    [Key in AreaChartData['xAxis'] | AreaChartData['yAxis']]: string | number;
  }[];
};

在我的例子中,我希望xAxis和yAxis是字符串,但是在"data"属性中,xAxis和yAxis的值应该被用作字符串,这样我就可以强制用户至少有两个键来命名这些值。
现在它的一种工作方式是定义两个泛型并在以后使用它们。但我希望我能动态地将值转换为类型。
我用的是最新版的 typescript 。

ut6juiuv

ut6juiuv1#

您将永远无法将值转换为类型。
类型只存在于编译时。
值只存在于运行时。
您在此问题中创建的类型等效于:

type AreaChartData = {
  xAxis: string;
  yAxis: string;
  data: {
    [ key:string]: string | number;
  }[];
};

下面是一个建议:

type AreaChartData2<xAxis extends string='x',yAxis extends string ='y'> = {
  xAxis: xAxis;
  yAxis: yAxis;
  data: {
    [key in xAxis|yAxis]: string | number;
  }[];
};

const a : AreaChartData2 <'lat','long'> = {
    xAxis:'lat',
    yAxis:'long',
    data:[{
        lat:"plouf",
        long:23
    }]
}

相关问题