为什么TypeScript允许这样做?

时间:2020-02-04 10:05:38

标签: typescript

在TypeScript中,我正在发出一个GET请求,该请求会导致这样的JS对象:

// Note: The variable is not actually declared and hardcoded like this
// This is just to demonstrate what the received object looks like
let obj = {id: "1"};

我还有以下课程:

export class Test {
    constructor(public id: number) { }
}

然后我像这样创建此类的新实例:

let aClass = new Test(obj.id);

令我惊讶的是,实例创建得很好。一开始我以为“很酷!它会自动尝试将id强制转换为数字!”但是事实并非如此,这让我有些困惑。

console.log(typeof aClass.id);

显示ID为字符串类型。我固执地拒绝相信这一点,并尝试:

console.log(aClass.id += 12);

正如我应该在此时想到的那样,它在字符串后附加了“ 12”。

现在,我的问题是:为什么会发生这种情况,为什么它不会引发错误?

1 个答案:

答案 0 :(得分:3)

问题是,Typescript键入在编译时适用。

GET请求中检索到的数据将始终被视为any,除非您对此进行了处理。因为Typescript无法确定数据是什么类型(可能是任何东西)。

您可以做的是强烈键入GET请求的返回值。然后打字稿会给你一个错误。但是警告,如果GET请求没有返回所需数据,它不会给您错误。

const data: {
  id: string,
} = GET();

// ...

为了进行验证,有一些可用的插件,例如https://github.com/hapijs/joi


我建议您为每个GET请求定义接口,例如:

interface GetUserR {
   users: {
     id: string,
     name: string,
   }[],
}

const users: GetUserR = await requester.GET('users');

通过这种方式,您可以自动完成,很容易发现错误并且容易出错。最好是,如果您处理正面和背面,则让后端发出这些接口。