打字稿类型分配

时间:2016-10-07 09:31:32

标签: javascript typescript

我正在学习打字稿,我遇到了问题...

为功能键入分配

以下是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);
}

但是就这样,即使我的“回应”不是“狗”的数组,它也不会触发任何错误;

我错过了什么?

1 个答案:

答案 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。它有助于描述程序的各个部分。它无法帮助检查程序动态接收的数据。