类型Assert“as”在typescript中如何工作

oxf4rvwz  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(152)

请解释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',行上,编译器会将其突出显示为错误?

ulydmbyx

ulydmbyx1#

as完全覆盖类型检查。
当你使用它的时候,你是在告诉编译器这个对象的类型是myModel,并且它会这样对待它。
这是一种告诉编译器你,程序员,比编译器更了解对象的类型的方法。
在你的特定例子中,as声明显然是一个谎言。
当你有这样的东西时,它会更有意义:

const myHttpResponse = await fetch(url_to_user_json);
 const myUserObject = (await myHttpResponse.json()) as User;

...因为TypeScript只知道json()方法返回一些可以从JSON中解析出来的东西(比如一个字符串,一个数字,或者任何类型的基本对象,等等)。
我通常倾向于完全避免as,而倾向于使用自定义类型保护函数执行运行时检查,这样如果出现错误(例如:API设计者改变并以不同的形式返回JSON),这样我就可以更早地捕捉到它,并提供更清晰的错误消息)。

相关问题