TypeScript 接受 non-number/string 值,尽管预期的参数类型是数字

TypeScript accepts non-number/string value although the expected parameter type is a number

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

TypeScript 似乎无法保证类型安全,我想知道它是否像 "designed" 一样工作,或者是否有它的原因。这是一个重现问题的最小示例:

  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在执行前会被转换成JavaScript。所以所有的打字都会消失。 当你声明一个像

这样的函数时
async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]>

您要求 TypeScript 来检查参数和 return 类型是否为合适的类型。但是这个检查只在转译(和开发,有一个很好的IDE)时间完成。在运行时,类型会消失,你可以提供任何你想要的,既不会有控制也不会有强制转换。只有 JavaScript 部分会保留:

async getProxyCache(page = 0, pageSize)

如果你想知道为什么 TypeScript 接受你用任何不是 number 的东西调用你的函数,那么检查 page 的类型函数被调用。如果它是 any 类型,则它被声明为与任何东西兼容。在这种情况下,最好将其声明为 unknown,这需要在使用前检查类型是否合适。