TypeScript接受非数字/字符串值,尽管期望的参数类型是数字

问题描述 投票:0回答:1

我面临TypeScript的一个奇怪问题,我无法理解。这可能与我缺乏知识有关,因为我从未在Java中遇到过此类问题,这是我在TypeScript / NestJS中的第一步(错误修复)。

似乎TypeScript中的类型安全性不能得到保证,我想知道它是否按“设计的”方式工作,或者是否有原因。这里是重现此问题的最小示例:

  async findAll(@Query() query, @Res() res: Response) {
      ... lines omitted ...
      this.cache.getProxyCache(query.page, query.page_size);
      ... lines omitted ...
  }

query是我从NestJS控制器中的@Query装饰器获得的对象。

  async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]> {
    console.log(`page: ${page} typeof: ${typeof page}`);
    console.log(`pageSize: ${pageSize} typeof: ${typeof pageSize}`);

    let pageSizeAdded = pageSize + 3;
    console.log(`pageSizeAdded: ${pageSizeAdded} typeof: ${typeof pageSizeAdded}`);

    let pageSizeAdded2 = Number(pageSize) + 3;
    console.log(`pageSizeAdded2: ${pageSizeAdded2} typeof: ${typeof pageSizeAdded2}`);
    ... lines omitted ...

输出为(注意pageSizeAdded,这是错误,pageSizeAdded2的计算正确,因为我从string转换为number):

page: 1 typeof: string
pageSize: 4 typeof: string
pageSizeAdded: 43 typeof: string
pageSizeAdded2: 7 typeof: number

我想知道pagepageSizestring的类型,尽管函数参数是用number类型声明的。

[当我尝试直接使用字符串值(例如this.cache.getProxyCache('1', '2');)调用该函数,但从另一个对象传递该值时,它接受一个非数字值,似乎TypeScript显示错误消息。

有人遇到过同样的问题吗?这是一个错误,已知的限制?为什么允许它?

谢谢克里斯托夫

typescript nestjs type-safety
1个回答
0
投票

您必须了解,在执行之前,TypeScript将转换为JavaScript。因此,所有键入将消失。当您声明类似[]的函数时

async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]>

您要求TypeScript

来检查参数和返回类型是否为适当的类型。但是,此检查仅在转译(以及具有良好IDE的开发人员)时进行。在运行时,这些类型将消失,并且您可以提供所需的任何内容,既没有控件也没有强制类型转换。仅JavaScript部分将保留:
async getProxyCache(page = 0, pageSize)

如果想知道为什么TypeScript

接受使用非number的任何东西调用函数,然后检查调用该函数的page的类型。如果类型为any,则声明它与任何东西兼容。在这种情况下,最好将其声明为unknown,这需要在使用该类型之前检查该类型是否合适。
© www.soinside.com 2019 - 2024. All rights reserved.