【发布时间】:2020-04-27 13:56:15
【问题描述】:
我为我的 NestJs REST API 创建了一个自定义配置文件。这是应用程序正在侦听的端口的一个简单示例。
我有一个包含内容的 .env 文件
SERVER_PORT = 3000
我的配置文件示例
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import * as Joi from '@hapi/joi';
@Injectable()
export class ServerConfigService {
constructor(private readonly configService: ConfigService) {
const { error } = Joi.object({
port: Joi.number()
.port()
.required(),
}).validate({ port: this.port });
if (error) { // no error thrown
throw error;
}
console.log(typeof this.port); // type is string but should be number
}
public get port(): number {
return this.configService.get<number>('SERVER_PORT');
}
}
我希望端口类型是number,但它仍然是string。所以我想到了两件事:
- 我使用泛型类型调用
this.configService.get<T>('key'),如图所示here。为什么它仍然返回一个字符串?我希望有一个类型转换。 - 我使用 joi 进行验证,如 here 所述。我希望 joi 会抛出错误。
端口变量可能是一个不好的例子,因为 Nest 能够处理字符串类型的端口。但是如果配置变量应该是数字但属于字符串类型,则其他部分需要数字并抛出错误。
我错过了什么吗?
【问题讨论】:
-
get()方法实际上是通用的吗?查看源代码,it's not。即使它是通用的,它也可能实际上是一个字符串,我怀疑实现是否能够执行该转换,通用参数在运行时不可用,也无法对此做任何事情。 -
感谢您的回复。链接的 NestJsx 存储库不是我认为的官方存储库?那我为什么要提供一个类型=?进一步为什么 Joi 验证成功.. 至少这个应该抛出一个错误...
-
是的,对不起,我意识到我挖得越多。我找不到那个
ConfigService类的来源。 ¯_(ツ)_/¯ -
但是,我的评论的第二部分仍然有效,你可以真正告诉编译器返回值应该被视为一个数字,但这并不一定意味着它会是一个数字。
-
好的found it,它绝对不执行任何转换,它只是获取价值。运行时类型将被读取,这可能是所有字符串。你需要自己转换。
标签: typescript nestjs joi