在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”。
现在,我的问题是:为什么会发生这种情况,为什么它不会引发错误?
答案 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');
通过这种方式,您可以自动完成,很容易发现错误并且容易出错。最好是,如果您处理正面和背面,则让后端发出这些接口。