TypeScript 中未声明属性错误提示不一致?-灵析社区

满脑子智慧溢出

如下代码: interface IPerson { name: string; others: { hobby: string }; } function testFn(type: IPerson) { console.log("🚀 ~ testFn ~ type:", type); } testFn({ name: "123", age: 18, others: { hobby: "跑步", name1: "124" } }); const p1 = { name: "123", age: 18, others: { hobby: "跑步", name1: "124" } }; testFn(p1); 在 vs code 中,有一个报错提示: ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/03d2c9f5eeccf45f75454a83026a60e6.png) 我有2个疑问: 1. 为什么 age、name1 都没有在 IPerson 中声明,但只提示了 name1 没有声明的错误,没有 age 的错误提示? 2. 把字面量形式的对象赋值给 p1 变量,然后传给 testFn,为啥此时没有任何错误提示了呢? 尝试将这段代码放在多个地方,排除了 tsconfig.json 配置的原因。

阅读量:163

点赞量:0

问AI
区别在于前者你是直接传了一个字面量进去,后者是通过一个中间变量(且未声明类型)传入的。 对于前者而言 TS 的类型检查会更严格,这一特性叫 "Freshness" (https://link.segmentfault.com/?enc=1z9niGJAWQuAqWl8U5FzRA%3D%3D.j3j3BJV5vJYQ9u2iYjpi9IeQT3%2FKKSKglWw7Y%2F4Idhgb3PeSmaNH1j%2FqBubqmceyRbdN9W00ClsSxt7rLH0opw%3D%3D) (默认开启,可通过 tsconfig.json 里的 "suppressExcessPropertyErrors" 配置项关闭)。而后者就是普通的鸭子类型检查。 至于为啥有这种特性,感兴趣可以自己搜索了解。 P.S. 问题一并不是个问题,只是 TS 报错是一种“懒检查”,即同类型的错误已经检查到了后面就跳过了,这样能显著地加快检查速度。你把 name1 删了就能看到 age 也一样报错了。