interface objType{
    name:string,
    age:number,
    height:number
}
// 添加address后就会报错
let obj:objType={
    name:"张三",
    age:20,
    height:150,
    address:"你猜我在哪"
}


export {
    
}

我们obj当中添加一个接口没有属性时候报错

但是当我们需要属性添加一个新的对象并且不使用接口时候就不会报错 

如下

interface objType{
    name:string,
    age:number,
    height:number
}
// 创建一个变量info
let info={
    name:"李四",
    age:20,
    height:150,
    address:"我在这"
}
// 字面赋值obj
// 给要添加obj描述接口


let obj:objType=info
console.log(info);
console.log(obj);

原因

如果直接使用字面赋值对象时候默认会进行类型推导 也就意味着 对象obj当中相对于objType接口会多出一个address类型 所以会报错 但是如果使用这种变量赋值方法相当于赋值的是引用ts当中编译类型时候会做出擦除(freshness)的操作

接口(objType)擦除(freshness简单理解来说是指如果赋值对象info相对接口(objType)中描述类型如果全部都满足的话就不会报错 如果info中缺少一个objType中的属性的话就会报错

但是这种用法还是会有bug!!

function fn(num: fnType) {
    // 在这里不能使用address就是接口描述中所没有的属性
    console.log(num.address);

}
let n = {
    name: "王五",
    age: 20,
    address: "就不告诉你"
}
// 不会报错

fn(n)

如果我们使用objType中没有描述过的属性的话是会报错的  我们发现他会走接口编译过程

所以这种用法还是推荐大家使用

原文地址:https://blog.csdn.net/m0_69507175/article/details/126843370

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_40658.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注