NestJS在package @nestjs/common中有接口类型。但是在两天内我无法详细了解它的作用。你能帮助我吗?
作为一个例子,我选择了这篇文章https://docs.nestjs.com/graphql/resolvers#class-inheritance
https://github.com/nestjs/nest/blob/master/packages/common/interfaces/type.interface.ts
export interface Type<T = any> extends Function {
new (...args: any[]): T;
}
创建模板类的简短用法示例
x一个一个一个一个x一个一个二个x
当我将字符串“T2 extends IProtoData”替换为“T2 extends Type”时,TS向我发送错误
错误TS 2344:类型“Coordinate”不满足约束“Type”。类型“Coordinate”缺少类型“Type”的以下属性:apply、call、bind、prototype,还有5个。
第二步
怎么啦?
一个三个三个一个
因此,我对这个设计有一个误解。它是做什么的?
export interface Type<T = any> extends Function {
new (...args: any[]): T;
}
第三步:
是的,我知道我不应该使用它。我试图理解这个机制本身。这个机制是做什么的?
我正确地理解了type.interface.ts的作用:
1.我们获取接口中描述的属性列表
1.继承Function对象
1.调用函数创建方法“new(... args:[]);”
1.因此,我们得到的不是一个接口,而是一个Javascript函数的示例。
或者我错了?我完全被这段代码搞糊涂了。
答案
示例:https://codesandbox.io/s/od6deu
你错了。我们根本没有得到类的示例。它仍然是Typescript,它都只是类型值。Type类型帮助器的作用是说我们期望在这里接收类引用而不是类示例。无论是满足接口的类引用还是直接满足类都是无关紧要的。想想@Module中的imports数组()。我们不传递new AuthModule()给它,我们只传递AuthModule,剩下的由Nest来处理。这就是这里的情况。在你的例子中,你使用了forwardRef,它应该指向另一个类。这是一个类引用
可以把Type接口想象成类似newable的东西。我们可以在Type类型的参数上调用new Thing(),但是是动态的。
function createClass<T>(classRef: Type<T>): T {
return new classRef();
}
现在如果我们调用createClass(AuthService),即使我们传递了一个类引用,我们也会得到一个AuthService的示例,Typescript对此很满意,因为classRef的类型是Type,并且知道它返回T,即示例类型
1条答案
按热度按时间j0pj023g1#
Type
是一个Typescript类型,它表示我们期望的是一个class reference,而不是一个class示例。这在Nest的@Module()
的imports
和providers
数组等地方很有用,这样用户就可以传递类本身,而不必示例化它。您的T1
保持为Type<>
是有意义的,因为您将类引用传递给@Inject(forwardRef(() => T1))
,而@Inject(forwardRef(() => T1))
* 应该 * 是类型引用。看起来你需要直接的T2
而不是Type<T2>
,这样你就知道返回那个类类型的 * 示例 *(或者满足类型的对象)