TypeScript:能否定义继承其他类型的泛型类型?
解决TypeScript重复泛型约束的问题
你想要提取重复的泛型约束<T extends Record<string, unknown>>以减少代码冗余,之前的尝试方向有误,以下是正确的实现方式:
正确方案:提取约束为类型别名
首先定义一个类型别名来替代重复的Record<string, unknown>约束:
type ExtendedRecord = Record<string, unknown>;
然后在你的泛型类型/接口中复用这个约束:
type SortDescriptor<T extends ExtendedRecord> = { // 这里添加你的属性 }; interface Config<T extends ExtendedRecord> { // 这里添加你的属性 } interface TableDataSort<T extends ExtendedRecord> { // 这里添加你的属性 }
为什么之前的尝试无效?
- 第一种写法
type ExtendedRecord<T> = <T extends Record<string, unknown>>;:这不是合法的TypeScript语法,泛型类型别名的右侧必须是具体的类型定义,不能直接写泛型约束语法。 - 第二种写法
type ExtendedRecord<T extends Record<string, unknown>> = T;:这只是把传入的T原样返回,本质是一个“透传”类型别名。当你写SortDescriptor<ExtendedRecord>时,是把ExtendedRecord这个泛型类型本身作为参数传入,而不是应用约束,所以达不到复用约束的效果。
进阶优化:泛型参数默认值
如果大部分场景下不需要指定具体的T类型,可以给泛型参数加默认值,进一步简化使用:
type SortDescriptor<T extends ExtendedRecord = ExtendedRecord> = {}; interface Config<T extends ExtendedRecord = ExtendedRecord> {}; interface TableDataSort<T extends ExtendedRecord = ExtendedRecord> {}; // 使用时可以直接写,无需指定T const desc: SortDescriptor = {};
内容的提问来源于stack exchange,提问作者Alejandro B.
相关产品推荐
相关产品推荐

