英文:
Typescript is NOT complaining about type error in Object Spread Syntax
问题
以下是翻译好的部分:
以下片段应该引发 TypeScript 错误,但是在使用对象扩展语法时,任何片段都没有抱怨。
请注意,我故意为了这个测试在 address
属性上加了一个拼写错误。
片段 A.1. - 没有引发错误
interface TestType {
company?: string;
address?: string;
}
function testFunction(): TestType {
const cond = true;
const testDto = {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto;
}
片段 A.2. - 没有引发错误
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto: TestType = {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto;
}
片段 A.3. - 没有引发错误
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto= {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto as TestType;
}
片段 B.1. - 成功引发错误
这个片段成功引发 TypeScript 错误,因为我移除了对象扩展语法,并且将接口定义放在了常量名后面。
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto: TestType = {
company: '',
addressss: '',
};
return testDto;
}
片段 B.2. - 没有引发错误
即使移除了对象扩展语法,但是接口定义放在函数返回类型中时,这个片段仍然没有引发 TypeScript 错误。
interface TestType {
company?: string;
address?: string;
}
function testFunction(): TestType {
const cond = true;
const testDto = {
company: '',
addressss: '',
};
return testDto;
}
我也在一个在线 TypeScript 编辑器中进行了测试,以排除可能与我的环境相关的问题。
有人可以帮我理解发生了什么吗?此外,有人能提供一个在使用对象扩展语法时检测拼写错误的解决方案示例吗?
非常感谢!
英文:
The following Snippets should throw a typescript error, but it's not complaining in any snippet when the object spread syntax is used.
Please note, that a added a typo for the address
property on purpose for this test.
Snippet A.1. - not throwing error
interface TestType {
company?: string;
address?: string;
}
function testFunction(): TestType {
const cond = true;
const testDto = {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto;
}
Snippet A.2. - not throwing error
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto:TestType = {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto;
}
Snippet A.3. - not throwing error
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto= {
...(cond ? { company: '' } : {}),
...(cond ? { addressss: '' } : {}),
};
return testDto as TestType;
}
Snippet B.1. - successfully throwing error
This Snippet is successfully throwing a typescript error, because I removed the object spread syntax and put the interface definition right after the constant name.
interface TestType {
company?: string;
address?: string;
}
function testFunction() {
const cond = true;
const testDto:TestType = {
company: '',
addressss: '',
};
return testDto;
}
Snippet B.2. - not throwing error
This Snippet is still not throwing a typescript error, even if object spread syntax is removed, but the interface is defined in the function return type.
interface TestType {
company?: string;
address?: string;
}
function testFunction():TestType {
const cond = true;
const testDto = {
company: '',
addressss: '',
};
return testDto;
}
I also tested in an online typescript editor to exclude potential issues with my environment.
Can somebody help me understand what's going on? Also, could someone provide an example with a solution that detects misspellings when the object spread syntax is used?
Thanks a lot!
答案1
得分: 1
You declared company
& address
as optional (by using ?:
). So TypeScript is okay with your return object not having those properties. This should throw an error:
interface TestType {
company: string; // I removed the question mark
address: string;
}
function testFunction(): TestType {
const cond = true;
const testDto = {
...(cond ? { company: '' } : {}),
...(cond ? { address: '' } : {}),
};
return testDto;
}
英文:
You declared company
& address
as optional (by using ?:
).
So typescript is ok to that your return object hasn't those properties.
This should throw an error:
interface TestType {
company: string; // I removed the questions mark
address: string;
}
function testFunction(): TestType {
const cond = true;
const testDto = {
...(cond ? { company: '' } : {}),
...(cond ? { address: '' } : {}),
};
return testDto;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论