【问题标题】:TypeScript accepts non-number/string value although the expected parameter type is a numberTypeScript 接受非数字/字符串值,尽管预期的参数类型是数字
【发布时间】:2020-02-28 22:52:33
【问题描述】:

我遇到了一个我无法理解的 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 似乎显示错误消息。

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

谢谢,克里斯托夫

【问题讨论】:

  • 您的 query 参数似乎没有类型。
  • 如果您的查询类型有类似:interface Query { page: any; } 的内容,那么其中可能包含字符串。因为any 可以映射到任何其他类型。

标签: typescript nestjs type-safety


【解决方案1】:

你要明白 TypeScript 在执行前会被转换成 JavaScript。所以所有的打字都会消失。 当你声明一个像

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

你要求 TypeScript 来检查参数和返回类型是否合适。但是此检查仅在编译(和开发,具有良好的 IDE)时进行。在运行时,类型会消失,你可以提供任何你想要的,既没有控制也没有强制转换。只有 JavaScript 部分会保留:

async getProxyCache(page = 0, pageSize)

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

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 2017-12-30
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2019-12-24
    • 2019-01-30
    相关资源
    最近更新 更多