簡體   English   中英

configService.get<T> (&#39;key&#39;) 類型轉換失敗,驗證失敗

[英]configService.get<T>('key') fails on type cast and joi on validation

我為 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')如圖這里用一個通用的類型。 為什么它仍然返回一個字符串? 我希望類型轉換。
  • 我使用 joi 進行驗證,如here所述。 我希望 joi 拋出錯誤。

端口變量可能是一個不好的例子,因為 Nest 能夠處理字符串類型的端口。 但是,如果配置變量應該是數字但類型是字符串,則其他部分需要數字並拋出錯誤。

我錯過了什么?

您發現的使用ConfigService的示例非常具有誤導性。 誤導的是泛型類型參數。 您傳遞給它的類型只會影響返回值的處理方式。 實際運行時類型將是讀取時的任何類型。

NestJs 使用dotenv來讀取配置文件,並且所有值都只是作為字符串讀取。 不進行任何轉換。

你應該像這樣使用它:

public get port(): number {
  return +this.configService.get('SERVER_PORT');
}

配置服務源
dotenv 源

如上所述,這是非常具有誤導性的,應該更改。 如果泛型表示具體類型,則沒有理由顯式轉換返回值。

我不明白的是為什么沒有類型轉換異常:

const myNumber:number = this.configService.get('PROPERTY_PATH');

即使 ConfigService 有效地返回一個字符串,它如何按原樣分配給一個數字? 事實上,即使 myNumber 明確定義為數字,它也將有效地成為一個字符串。 這也是一個 Typescript 問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM