将javascript Error对象转换为Typescript语法

时间:2018-01-29 22:09:55

标签: typescript

我有这个功能,曾经在普通的JavaScript中工作。我现在正试图将其“转换”为Typescript。

function checkStatus(response :any) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  } else {
    const error = new Error(`HTTP Error ${response.statusText}`);
    error.status = response.statusText;
    error.response = response;
    console.log(error);
    throw error;
  }
}

我编辑中的红色波浪线表明:

[ts]“错误”类型中不存在属性“status”。任何

[ts]属性'响应'在类型'错误'上不存在。 任何

因此,在Typescript域中的某处定义了Error对象的打字稿版本及其在Error对象上缺少的状态和响应字段吗? 谢谢

2 个答案:

答案 0 :(得分:2)

Error对象默认不具有这些属性。您可以在Javascript中执行此操作,因为您可以将任何属性添加到Javascript中的任何对象。你可以做以下两件事之一:

在错误界面

上添加属性

在全局命名空间中声明一个具有相同名称的接口。在typescript中,合并了多个接口声明,并使用了生成的接口:

interface Error {
    status: string;
    response: HttpRequest
}

创建专用的HttpError

这可能是一种更好的方法,因为任何错误都不会出现属性。只需定义一个派生自错误的类,该类具有额外的属性:

class HttpError extends Error {
    status: string;
    response: HttpRequest
}

const error = new HttpError(`HTTP Error ${response.statusText}`);
error.status = response.statusText;
error.response = response;

答案 1 :(得分:1)

  

所以在某处定义了Error对象的打字稿版本   在Typescript中及其缺失的状态和响应字段   错误对象?

是的,打字稿中的Error对象在library type definition file中定义,并且没有statusresponse属性:

interface Error {
    name: string;
    message: string;
    stack?: string;
}

将对象的属性分配给未在该对象的声明类型中定义的一种可能方法是使用Object.assign()

function checkStatus(response :any) {
    if (response.status >= 200 && response.status < 300) {
        return response;
    } else {
        const error = Object.assign(
            new Error(`HTTP Error ${response.statusText}`),
            {
                status: response.statusText,
                response
            }
        );
        console.log(error);
        throw error;
  }
}