我正在学习打字稿,我遇到了问题...
为功能键入分配
以下是2个简单的代码示例,它们以不同的方式进行编译,但我没有理由。
1个样本
testP(): Promise<number> {
return new Promise<string>((resolve, reject) => {
resolve("string");
});
}
此代码在编译期间返回错误,因为我没有返回数字,这没关系。
2个样本
testP(): Promise<number> {
return new Promise<any>((resolve, reject) => {
resolve("string");
});
}
此代码编译没有任何错误,我不知道为什么......
我错了什么? 提前谢谢!
编辑:
这是我实际上要做的事情
export interface Animal {
name: string,
weight: number,
age: number
}
getDogs(): Promise<Dog[]> {
return this.http.get('/dogs')
.toPromise()
.then(response => response.json())
.catch(this.handleError);
}
但是就这样,即使我的“回应”不是“狗”的数组,它也不会触发任何错误;
我错过了什么?
答案 0 :(得分:3)
编译器无法通过调用resolve
来推断承诺的返回类型。
此代码:
return new Promise((resolve, reject) => {
...是:
的简写return new Promise<any>((resolve, reject) => {
然后类型any
是一种禁用类型检查的方法。你的第二个代码编译但是错了。
如果您不想重复自己,可以这样做:
let testP = function () {
return new Promise<string>((resolve, reject) => {
resolve("string");
});
}
此处,函数的返回类型推断为Promise<string>
。
编辑#1(回答你的回答):Promise<any>
与Promise<number>
兼容,"string"
也与any
兼容。但Promise<string>
与Promise<number>
不兼容。实际上,any
允许您执行错误的代码。当您使用它时,由您自己知道自己在做什么。
编辑#2:
关于此代码:
export interface Dog {
name: string,
weight: number,
age: number
}
function getDogs(): Promise<Dog[]> {
return this.http.get('/dogs')
.toPromise()
.then(response => response.json())
.catch(this.handleError);
}
TypeScript编译器检查静态类型。它无法检查服务器返回的字符串值的类型,因为在运行时,在浏览器上,只有编译后的代码根本没有类型元数据。
TypeScript就像JSDoc。它有助于描述程序的各个部分。它无法帮助检查程序动态接收的数据。