【发布时间】:2021-03-26 15:33:25
【问题描述】:
让我们在 TypeScript (4.0.5) 中创建带有列 data 的 JSON 类型的 SQL 数据库表和此枚举:
enum EContentType {
NOTHING,
IMAGE,
VIDEO
}
根据ContentType,我将不同的 JSON 模式保存到我的数据库中的data 列中。
例子:
- 对于
IMAGE,保存{"path": "/foo/bar", "type": "jpeg"} - 对于
VIDEO,保存{"path": "/foo/bar", "length": 60}
是否可以使用泛型为这个 data 对象创建 TypeScript 类型,根据 EContentType 正确键入什么?
类似(伪):
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}
【问题讨论】:
标签: javascript typescript