Javascript 基于泛型类型定义类型脚本类型

Javascript 基于泛型类型定义类型脚本类型,javascript,typescript,Javascript,Typescript,让我们使用列为JSON类型的data的SQL数据库表和类型脚本(4.0.5)中的枚举: enum EContentType{ 没有什么, 形象,, 视频 } 根据ContentType的不同,我将不同的JSON模式保存到data列中并保存到数据库中 例如: 对于图像,保存{“路径”:“/foo/bar”,“键入”:“jpeg”} 对于视频,保存{“路径”:“/foo/bar”,“长度”:60} 是否可以使用泛型为该数据对象创建类型脚本类型根据EContentType正确键入什么 类似于(伪

让我们使用列为JSON类型的
data
的SQL数据库表和类型脚本(4.0.5)中的枚举:

enum EContentType{
没有什么,
形象,,
视频
}
根据
ContentType
的不同,我将不同的JSON模式保存到
data
列中并保存到数据库中

例如:

  • 对于
    图像
    ,保存
    {“路径”:“/foo/bar”,“键入”:“jpeg”}
  • 对于
    视频
    ,保存
    {“路径”:“/foo/bar”,“长度”:60}
是否可以使用泛型为该
数据
对象创建类型脚本类型根据
EContentType
正确键入什么

类似于(伪):

类型TDataType={
[ContentType.IMAGE]:{path:string,type:string}
[ContentType.VIDEO]:{path:string,length:number}
}
用法:

const-concreteType:EContentType=EContentType.IMAGE;
const typedDataField=作为TDataType的数据字段;
这可能吗?或者不是,因为TypeScript只是静态类型的。。。 如何保证类型安全(不允许某人为
图像
内容类型保存
长度
属性)有什么不同的想法吗

如果没有办法做到这一点,那么类型是什么

const data1=dbDataField作为TDataType/{path:string,type:string}
const data2=dbDataField作为TDataType/{path:string,length:number}
类型TDataType={
[输入EContentType]:{path:string,type:string}
}
类型TDataType2={
[key-in-keyof-T]:{path:string;type:string};
};
你可以这样用


(示例)

enum EContentEnum{
没有什么,
形象,,
视频
}
类型TDataType2={
[key-in-keyof-T]:{path:string;type:string};
};
常量contentData:Pick={
图片:{
路径:“imagePath”,
类型:“imageType”,
},
};
contentData.IMAGE

这是我的答案,但我不确定您是否需要它。

如果您将
ContentType
声明为一个类型,而将其用作一个值,那么这将不起作用。更好的方法是使用一个接口,
将所需的属性扩展到generic上,用于任何您想要预定义的内容

interface TDataType <T>{
   [key: string]: T
}

let a: TDataType<{path: string, type: string}>;
a.IMAGE = {path: 'aaa', type: 'bbbb'};
console.log(a); // output:  "IMAGE": {"path": "aaa", "type": "bbbb"}
接口数据类型{
[键:字符串]:T
}
设a:TDataType;
a、 IMAGE={path:'aaa',type:'bbbbbb'};
console.log(a);//输出:“图像”:{“路径”:“aaa”,“类型”:“bbbb”}
或者使用
记录
实用程序类型来定义

接口内容{
路径:string,类型:string
}
键入ContentType=“IMAGE”|“VIDEO”;
const concreteType:记录={
图像:{路径:,类型:}
};

这似乎不起作用。。。我需要有通用的动态,而不是静态写入代码。我在问题中添加了
用法:
示例。对不起,这没有帮助。。。我认为typescript不支持动态类型。只是支持静态类型。我知道,这就是为什么我问:/那么基于静态泛型的类型呢?像这样:
TDataType
我不推荐
TDataType
,因为
TDataType2
是您想要的包含类型。好吧,那么您如何在一种类型中定义多个对象呢?我在你的例子中看不到这一点
enum EContentEnum {
  NOTHING,
  IMAGE,
  VIDEO,
}

type TDataType2<T> = {
  [key in keyof T]: { path: string; type: string };
};

const contentData: Pick<TDataType2<typeof EContentEnum>, 'IMAGE'> = {
  IMAGE: {
    path: 'imagePath',
    type: 'imageType',
  },
};

contentData.IMAGE
interface TDataType <T>{
   [key: string]: T
}

let a: TDataType<{path: string, type: string}>;
a.IMAGE = {path: 'aaa', type: 'bbbb'};
console.log(a); // output:  "IMAGE": {"path": "aaa", "type": "bbbb"}
interface Content{
  path: string, type: string
}

type ContentType = "IMAGE" | "VIDEO";

const concreteType: Record<ContentType , Content> = {
  IMAGE: { path: "", type: ""}
};