Nodejs相关:问大家一个问题, TypeScript 中函数怎么以类而不是实例作为形参(Nodejs版)

发布于 1周前 作者 eggper 来自 nodejs/Nestjs

Nodejs相关:问大家一个问题, TypeScript 中函数怎么以类而不是实例作为形参(Nodejs版)

可能题目说得比较抽象,例如我们有个类:

class Dog {
  private name: string;
  public constructor(name: string) {
    this.name = name;
  }
  public getName(): string {
    return this.name;
  }
}

然后我有一个函数,接受类作为参数,返回一个对象:

function createDog(constructor: Dog): Dog {
   return new construtor('Teddy');
}

const teddy: Dog = createDog(Dog);

但是大家知道这样编译是会报错的,因为createDog接受的是 Dog 实例。我不想用 any,想把我的类限定在 Dog,想问一下createDog(constructor: Dog)应该怎么写才能实现我的需求。


7 回复

createDog(constructor: typeof Dog)

createDog(constructor: new(name: string) => Dog)

或者建一个对应 Dog 的 interface


interface DogCreator {
new(name: string): Dog
}

function createDog(constructor: DogCreator): Dog {
return new constructor(‘Teddy’);
}

你的单词写错了,看得我很难受。。。

另外,没必要这样写,perfer DI over FactorCreator

typescript 文档里面有提到的,在接口那一章。
interface Test {
new constructor():Dog
}
这样就行了

哈哈 其实只是举个例子 也没想用工厂 只是这边实现有个形参需要传个构造函数而已 谢谢啦(本来想礼貌性道歉 结果你也拼错了 2333333 )

在 TypeScript 中,如果你希望将一个类(而非其实例)作为函数参数传递给另一个函数,你可以使用 typeof 关键字来获取类的类型。这在 Node.js 环境下同样适用。

下面是一个简单的例子,展示如何在 Node.js 环境下实现这一点:

// 定义一个类
class MyClass {
    constructor(public name: string) {}

    greet() {
        console.log(`Hello, ${this.name}!`);
    }
}

// 定义一个接受类作为参数的函数
function createInstance(ClassType: typeof MyClass, name: string): MyClass {
    return new ClassType(name);
}

// 使用该函数创建 MyClass 的实例
const instance = createInstance(MyClass, 'World');
instance.greet(); // 输出: Hello, World!

在这个例子中:

  1. 我们定义了一个名为 MyClass 的类。
  2. createInstance 函数接受两个参数:一个是类类型 ClassType(这里使用了 typeof MyClass 来指定类型),另一个是用于实例化该类时传递给构造函数的参数 name
  3. createInstance 函数内部,我们使用 new ClassType(name) 来创建 MyClass 的实例。
  4. 最后,我们调用 createInstance 函数并传入 MyClass 类和字符串 'World',然后调用实例的 greet 方法。

这种方法允许你在运行时动态地根据提供的类类型来创建实例,这在某些设计模式和框架中非常有用。

回到顶部