javascript - 打字稿中工厂函数返回的类不检查打字
问题描述
我创建了一个模块工厂函数,它返回一个由@Module({})
. 我的问题是,该类取决于函数参数providerToken
,strategy
所以我不能将它移到函数之外。当我运行代码时,它工作得非常好,但是没有正确检查类型的forRoot
值forRootAsync
。事实上打字稿不会对此抛出任何错误。还有什么应该是我的函数的返回值。我已经把它放在这里any
以避免错误。
这就是我使用该函数创建模块的方式
const TwitterAuthModule =
createHybridAuthModule<TwitterAuthModuleOptions>(
TWITTER_HYBRID_AUTH_OPTIONS,
TwitterAuthStrategy
);
模块创建者工厂
export function createHybridAuthModule<T>(
providerToken: string,
strategy: any
): any {
@Module({})
class NestHybridAuthModule {
static forRoot(options: T): DynamicModule {
return {
module: NestHybridAuthModule,
providers: [
{
provide: providerToken,
useValue: options,
},
strategy,
],
};
}
static forRootAsync(
options: ModuleAsyncOptions<ModuleOptionsFactory<T>, T>
): DynamicModule {
return {
module: NestHybridAuthModule,
providers: [...this.createAsyncProviders(options), strategy],
};
}
private static createAsyncProviders(
options: ModuleAsyncOptions<ModuleOptionsFactory<T>, T>
): Provider[] {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
}
const useClass = options.useClass as Type<ModuleOptionsFactory<T>>;
return [
this.createAsyncOptionsProvider(options),
{
provide: useClass,
useClass,
},
];
}
private static createAsyncOptionsProvider(
options: ModuleAsyncOptions<ModuleOptionsFactory<T>, T>
): Provider {
if (options.useFactory) {
return {
provide: providerToken,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
const inject = [
(options.useClass || options.useExisting) as Type<
ModuleOptionsFactory<T>
>,
];
return {
provide: providerToken,
useFactory: async (optionsFactory: ModuleOptionsFactory<T>) =>
await optionsFactory.createModuleOptions(),
inject,
};
}
}
return NestHybridAuthModule;
}
创建的模块的使用。永远不会检查 forRoot 的值的类型
@Module({
imports: [
TwitterAuthModule.forRoot({
consumerKey: '********',
consumerSecret: '******',
callbackURL: '*******',
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
解决方案
typescript 不检查您的类型的原因是NestHybridAuthModule
因为any
函数createHybridAuthModule
返回类型是any
. 删除它并允许 typescript 推断返回类型。
如果--noImplicitReturns
使用,您可以使用通用接口
编辑:
感谢您指出。
更正示例:
interface INestHybridAuthModule<T> {
new(...args: any[]): any,
forRoot(options: T): DynamicModule
}
export function createHybridAuthModule<T>(
providerToken: string,
strategy: any
): INestHybridAuthModule<T> {
class NestHybridAuthModule {
static forRoot(options: T): DynamicModule {
// logic here
}
}
return NestHybridAuthModule
}
原来的:
简化示例:
interface INestHybridAuthModule<T> {
forRoot(options: T): DynamicModule
}
export function createHybridAuthModule<T>(
providerToken: string,
strategy: any
): new (...args: any[]) => INestHybridAuthModule<T> {
class NestHybridAuthModule {
forRoot(options: T): DynamicModule {
// logic here
}
}
return NestHybridAuthModule
}
推荐阅读
- java - 以编程方式识别 ant 任务是否已完成
- android - com.squareup.okhttp3 库的 Gradle 依赖问题
- php - 无法使用 SNMP 在 PHP 中获取真实的当前使用情况和可用 RAM
- angular - 如何修复此错误无法读取未定义的属性“attribut_id”
- php - '未插入' - 消息即将到来
- javascript - pm2默认以fork模式运行多个实例
- php - MySQL 在 foreach 中插入仅被调用一次
- python - 如何让 pyspark 使用自定义 python?
- xamarin - Mono 执行环境和 ART 之间有什么关系?
- ajax - Spring Rest 服务返回类型