Nodejs相关:问大家一个问题, TypeScript 中函数怎么以类而不是实例作为形参(Nodejs版)
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)
应该怎么写才能实现我的需求。
createDog(constructor: typeof Dog)
createDog(constructor: new(name: string) => Dog)
或者建一个对应 Dog 的 interface
另外,没必要这样写,perfer DI over FactorCreator
FactoryCreator
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!
在这个例子中:
- 我们定义了一个名为
MyClass
的类。 createInstance
函数接受两个参数:一个是类类型ClassType
(这里使用了typeof MyClass
来指定类型),另一个是用于实例化该类时传递给构造函数的参数name
。- 在
createInstance
函数内部,我们使用new ClassType(name)
来创建MyClass
的实例。 - 最后,我们调用
createInstance
函数并传入MyClass
类和字符串'World'
,然后调用实例的greet
方法。
这种方法允许你在运行时动态地根据提供的类类型来创建实例,这在某些设计模式和框架中非常有用。