我面临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
我想知道page
和pageSize
是string
的类型,尽管函数参数是用number
类型声明的。
[当我尝试直接使用字符串值(例如this.cache.getProxyCache('1', '2');
)调用该函数,但从另一个对象传递该值时,它接受一个非数字值,似乎TypeScript显示错误消息。
有人遇到过同样的问题吗?这是一个错误,已知的限制?为什么允许它?
谢谢克里斯托夫
您必须了解,在执行之前,TypeScript将转换为JavaScript。因此,所有键入将消失。当您声明类似[]的函数时
来检查参数和返回类型是否为适当的类型。但是,此检查仅在转译(以及具有良好IDE的开发人员)时进行。在运行时,这些类型将消失,并且您可以提供所需的任何内容,既没有控件也没有强制类型转换。仅JavaScript部分将保留:async getProxyCache(page: number = 0, pageSize: number): Promise<AxwayProxy[]>
您要求TypeScript
接受使用非async getProxyCache(page = 0, pageSize)
如果想知道为什么TypeScript
number
的任何东西调用函数,然后检查调用该函数的page
的类型。如果类型为any
,则声明它与任何东西兼容。在这种情况下,最好将其声明为unknown
,这需要在使用该类型之前检查该类型是否合适。