gpt4 book ai didi

javascript - 基于泛型类型定义 TypeScript 类型

转载 作者:行者123 更新时间:2023-12-04 03:45:05 24 4
gpt4 key购买 nike

让我们在 TypeScript (4.0.5) 中创建包含 JSON 类型列 data 和此枚举的 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}

最佳答案

这行不通,因为您要声明 ContentType作为一种类型,但将其用作值。更好的方法是使用接口(interface)和 extends你想要的任何你想要预定义的通用属性

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"}

或使用Record<Keys, type>要定义的实用程序类型 https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeystype

interface Content{
path: string, type: string
}

type ContentType = "IMAGE" | "VIDEO";

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

关于javascript - 基于泛型类型定义 TypeScript 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65315372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com