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