Typescript 为什么在对象文字和变量上键入的强制方式不同?
我想我在什么地方看到了这件事,但我再也找不到了 我想了解为什么TypeScript类型在对象文字和变量之间的应用/实施方式不同Typescript 为什么在对象文字和变量上键入的强制方式不同?,typescript,Typescript,我想我在什么地方看到了这件事,但我再也找不到了 我想了解为什么TypeScript类型在对象文字和变量之间的应用/实施方式不同 interface User { id: number; } function p(u: User) { } const u1 = { id: 123 } const u2 = { id: 124, foo: 'bar' }; p(u1); // << Works as expected p({ id: 124, foo: 'bar' })
interface User {
id: number;
}
function p(u: User) { }
const u1 = { id: 123 }
const u2 = { id: 124, foo: 'bar' };
p(u1); // << Works as expected
p({ id: 124, foo: 'bar' }); // << ERROR as expected: ' Object literal may only specify known properties'
p(u2); // << NO ERROR??
// workaround
const u3: User = { id: 124, foo: 'bar' }; // << ERROR as expected
用户界面{
id:编号;
}
函数p(u:User){}
常量u1={id:123}
constu2={id:124,foo:'bar'};
p(u1);// 总结一下我能做的最好的事情:检查对象文字是否有多余的属性(而不是“传递”对象)的原因是,多余的属性通常是由于在处理选项对象之类的对象时输入错误或其他类型的错误造成的,这是一种非常常见的模式
我不确定我自己是否完全同意这个理由,但事实就是如此\_(ツ)_/“谢谢,这正是我想要的。是的,我不喜欢不对称规则,这一条也不例外,但事实就是如此。有趣的是,他们甚至承认这是“令人惊讶的”>>'绕过这些检查的最后一种方法(可能有点奇怪)是将对象分配给另一个变量:因为squareOptions不会进行过多的属性检查,所以编译器不会给您错误。”