【发布时间】: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
我想知道page 和pageSize 是string 的类型,尽管函数参数是用number 类型声明的。
当我尝试使用字符串值(例如 this.cache.getProxyCache('1', '2'); )直接调用函数但从另一个对象传递时接受非数字值时,TypeScript 似乎显示错误消息。
有人遇到过同样的问题吗?这是一个错误,已知的限制?为什么允许?
谢谢,克里斯托夫
【问题讨论】:
-
您的
query参数似乎没有类型。 -
如果您的查询类型有类似:
interface Query { page: any; }的内容,那么其中可能包含字符串。因为any可以映射到任何其他类型。
标签: typescript nestjs type-safety