首页 > 解决方案 > 传递泛型类型的实例»按原样«

问题描述

考虑这个导致编译错误的示例代码:

interface Options<T extends string> {
  name: T
}

class A<T extends string> {
  constructor(readonly options: Options<T>){};
}


class B {
  constructor(readonly a: A) {}
//                  Error ~ Generic type 'A<T>' requires 1 type argument(s).
}


const 
  a = new A<'test'>({ name: 'test' }),
  b = new B(a)
;

有没有办法告诉打字稿,通用类型a: A应该a是创建的那个?

我试图在这里遵循依赖注入模式。因此我需要»传递创建的实例a«,包括它的通用设置。

我想我在这里扰乱了一些 OOP 概念,并试图获得一些在概念层面上没有意义的东西,但如果不是,那么解决这个问题的最佳方法是什么,

标签: typescriptgenerics

解决方案


由于Class A<T extends string>具有通用参数,因此您需要指定它。您可以为泛型参数定义默认值以修复编译时错误。

class A<T extends string = string>

有没有办法告诉打字稿, a: A 的泛型类型应该是创建 a 的那个?

由于参数在运行时传递给 B 的构造函数,因此打字稿编译器无法识别泛型类型。(注:编译后没有任何泛型类型)

打字稿代码

interface Options<T extends string> {
  name: T
}

// If T is not specified then T = string
class A<T extends string = string> {
  constructor(readonly options: Options<T>){};
}


class B {
  constructor(readonly a: A) {}
}


const 
  a = new A<'test'>({ name: 'test' }),
  b = new B(a)
;

编译代码

var A = /** @class */ (function () {
    function A(options) {
        this.options = options;
    }
    ;
    return A;
}());
var B = /** @class */ (function () {
    function B(a) {
        this.a = a;
    }
    return B;
}());
var a = new A({ name: 'test' }), b = new B(a);

更新

只是使class B也通用。编译器将根据需要选择类型。

interface Options<T extends string> {
  name: T
}

class A<T extends string> {
  constructor(readonly options: Options<T>){};
}

class B<T extends string> {
  constructor(readonly a: A<T>) {}
}


const 
  a = new A<'test'>({ name: 'test' }),
  b = new B(a)
;

谢谢!


推荐阅读