TypeScript如何从DataType枚举推导createTableWriteStream泛型元组类型
实现方案
该需求完全可以通过 TypeScript 泛型推断实现,只需按以下步骤调整类型定义即可:
1. 定义基础泛型类型
首先定义带类型约束的列定义、列转元组工具类型:
// 列定义泛型,约束type为DataType枚举值 type Column<T extends DataType = DataType> = { name: string; type: T; }; // 工具类型:将列数组的类型映射为对应的TS类型元组 type ColumnsToTuple<T extends readonly Column[]> = { [K in keyof T]: TypeMap[T[K]['type']] }; // 调整原有的TableWriteStreamOptions为泛型类型,关联columns的类型 interface TableWriteStreamOptions<Cols extends readonly Column[] = readonly Column[]> { columns: Cols; // 保留你原来TableWriteStreamOptions里的其他字段定义 }
2. 调整createTableWriteStream的泛型定义
把函数的泛型从直接接收元组改为先接收列数组类型,自动推导元组:
// 原函数入参泛型调整,无需再手动指定T export async function createTableWriteStream<Cols extends readonly Column[]>( path: string, options: FileOptions & TableWriteStreamOptions<Cols> ): Promise<TableWriteStream<ColumnsToTuple<Cols>>> { // 原有实现逻辑保持不变 }
3. 调用示例
调整后调用时不需要再手动传入泛型参数,TypeScript会自动根据columns的配置推断出对应的元组类型:
// 注意columns末尾加as const确保TS推断为固定长度元组,而非通用数组 const writeStream = await createTableWriteStream(testFile, { flags: 'w', columns: [ { name: "col1", type: DataType.STRING, }, { name: "column 2", type: DataType.NULLABLE_COMPACT_INT, }, ] as const }) // 此时writeStream的类型会自动推断为 TableWriteStream<[string, number | bigint | null]>
小提示:如果你使用的是 TypeScript 5.0+,且
columns配置是直接写在调用参数里的字面量,部分场景下不加as const也能正确推断元组,加as const是兼容性最好的写法。
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

