【问题标题】:class Thing<T> extends T类 Thing<T> 扩展 T
【发布时间】:2019-03-03 06:09:15
【问题描述】:

关于标题,打字稿中是否有可能等同于class Thing&lt;T&gt; extends T?最好以可读的方式。目前尝试这行代码会导致 VSCode 中出现错误Cannot find name 'T'。尝试在此处和谷歌上找到答案,但没有找到类似的答案。

【问题讨论】:

  • 你能更深入地解释一下这个用例吗?
  • 当然。我正在为各种课程编写测试。如果我想更改这些类中的任何一个的行为,或者如果它们是抽象的,我会创建一个 TestClass 类型的对象来扩展需要测试的类。我希望有一个像这样的中心结构,所以如果我不得不用额外的功能来装饰我的所有测试对象,我只需要在一个地方编写代码。

标签: javascript typescript class


【解决方案1】:

您不能直接这样做,您可以创建一个中间类,然后使用类型断言使其与返回 T 和类的自定义构造函数签名相匹配:

class _Thing { }

const Thing: {
  new <T>(): _Thing & T
} = _Thing as any;


new Thing<{ prop: string }>().prop

【讨论】:

    【解决方案2】:

    T 是一个类型,只能扩展值(类):

    function <T extends new(...arg:any[]) => any> Mixin(Parent: T) {
      return class Mixin extends Parent {
        // ...
      }
    }
    
    const Sub = Mixin(class Parent {
     works() { /*..*/ }
     //...
    });
    
    (new Sub).works();
    

    【讨论】:

    • 这实际上对我不起作用。 VSCode 在extends Parent 上抛出错误,说T is not a constructor function type。但是将T 更改为T extends new(...arg:any[]) =&gt; any 为我解决了这个问题。
    • @anthony aaah 对,我是 afk,所以我无法测试它,太好了,你可以修复它 :)
    • 但它不适用于抽象父母 :(。真可惜。如此接近!
    • @anthony “抽象”是什么意思?我猜你正在寻找联合类型然后......
    • Parent 的类型在我的代码中也可以是抽象的。显然这是一个已知问题https://github.com/Microsoft/TypeScript/issues/5843。不幸的是,能够说“可扩展但不可构造”并不是一个干净的问题。
    猜你喜欢
    • 2016-05-08
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多