让我们有一个SQL数据库表,列data
是JSON类型,下面的枚举是TypeScript(4.0.5):
enum EContentType {
NOTHING,
IMAGE,
VIDEO
}
字符串
根据ContentType
,我将不同的JSON模式保存到数据库的data
列中。
范例:
- 对于
IMAGE
,保存{"path": "/foo/bar", "type": "jpeg"}
- 对于
VIDEO
,保存{"path": "/foo/bar", "length": 60}
是否可以使用泛型为data
对象创建TypeScript类型,基于EContentType
将正确键入什么?
类似于(pseudo):
type TDataType<ContentType> = {
[ContentType.IMAGE]: {path: string, type: string}
[ContentType.VIDEO]: {path: string, length: number}
}
型
使用方法:
const concreteType: EContentType = EcontentType.IMAGE;
const typedDataField = dataField as TDataType<concreteType>;
型
这可能吗?或者不是,因为TypeScript只是静态类型的。如何保证类型安全(不允许某人为IMAGE
内容类型保存length
属性)有什么不同的想法吗?
如果没有办法做到这一点,那么输入什么将像这样工作:
const data1 = dbDataField as TDataType<EContentType.IMAGE> // {path: string, type: string}
const data2 = dbDataField as TDataType<EContentType.VIDEO> // {path: string, length: number}
型
3条答案
按热度按时间h6my8fg21#
如果你把
ContentType
声明为一个类型,而把它作为一个值,那么这是行不通的。更好的方法是在generic上使用接口和extends
所需的属性,以用于您希望预定义的任何内容字符串
或使用
Record<Keys, type>
实用程序类型定义https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeystype型
v2g6jxz62#
字符串
你可以这样使用。
示例)
型
这是我的答案,但我不确定你是否想要。
6xfqseft3#
有点晚了,但这里有一个可能的解决方案:
字符串
这只是一个示例,但它允许您使用相同的类型并动态选择所需的图像或视频类型。