TypeScript:如何让泛型接口的算法适配派生泛型类?
解决泛型函数返回派生类型的问题
先直接给出可行的代码实现:
interface GenericInterface<T> { value: T } function genericIdentity<T, Derived extends GenericInterface<T>>(instance: Derived): Derived { return instance; } class GenericImplementingClass<T> implements GenericInterface<T> { value!: T add() {} } let numberInstance = new GenericImplementingClass<number>(); let genericInstance = genericIdentity(numberInstance); genericInstance.add(); // 现在不会报错了
为什么原来的写法有问题?
原来的genericIdentity只约束参数为GenericInterface<T>,返回值也固定为GenericInterface<T>,TypeScript会丢失传入实例的具体派生类型信息,自然找不到add这类派生类独有的方法。
你的尝试问题出在哪?
- 第一个尝试里,
DerivedInterface extends GenericInterface<T>应该写在泛型参数定义里,而非参数类型位置。正确的泛型约束语法是在尖括号内声明Derived extends GenericInterface<T>,不能把约束逻辑写在参数类型中。 - 第二个尝试的错误在于,泛型参数不能嵌套定义成
DerivedInterface<T>这种形式。泛型参数只能是单个类型标识符,不能直接带泛型参数,你需要分开声明泛型参数并建立约束关系。
实际场景的应用(TreeWalker函数)
对应你提到的树结构场景,同样可以用这个思路:
interface TreeInterface<T> { value: T; children: TreeInterface<T>[]; } class Tree<T> implements TreeInterface<T> { value: T; children: Tree<T>[]; constructor(value: T) { this.value = value; this.children = []; } addChild(child: Tree<T>) { this.children.push(child); } } function TreeWalker<T, DerivedTree extends TreeInterface<T>>(tree: DerivedTree): DerivedTree { // 这里写遍历逻辑 return tree; } const myTree = new Tree(1); const walkedTree = TreeWalker(myTree); walkedTree.addChild(new Tree(2)); // 正常调用,不会丢失Tree类型的方法
内容的提问来源于stack exchange,提问作者Gamer2015
相关产品推荐
相关产品推荐

