请解释as
的工作原理:
我有一个简单的接口。
interface myModel {
name: string;
id: number;
}
有一个函数返回一个object { }作为myModel;
function getMyModel(): myModel{
return {
name: 'kek',
id: 8,
data: 'pew',
names: '321'
} as myModel
}
为什么如果我添加了不在myModel
中的属性,编译器不会抛出错误,而是记录一个属性不在myModel
接口中的对象?
console.log(getMyModel());
//[LOG]: {
// "name": "kek",
// "id": 8,
// "data": "pew",
// "names": "321"
//}
as
如何工作?
为什么我会这样写:
let test: myModel = {
name: 'kek',
id: 8
data: 'pew',
names: '321'
}
那么在data: 'pew',
行上,编译器会将其突出显示为错误?
1条答案
按热度按时间ulydmbyx1#
as
完全覆盖类型检查。当你使用它的时候,你是在告诉编译器这个对象的类型是
myModel
,并且它会这样对待它。这是一种告诉编译器你,程序员,比编译器更了解对象的类型的方法。
在你的特定例子中,
as
声明显然是一个谎言。当你有这样的东西时,它会更有意义:
...因为TypeScript只知道
json()
方法返回一些可以从JSON中解析出来的东西(比如一个字符串,一个数字,或者任何类型的基本对象,等等)。我通常倾向于完全避免
as
,而倾向于使用自定义类型保护函数执行运行时检查,这样如果出现错误(例如:API设计者改变并以不同的形式返回JSON),这样我就可以更早地捕捉到它,并提供更清晰的错误消息)。