在typescript中展开运算符剥离类型定义
我在打字稿中遇到了这种奇怪的现象。使用spread运算符时,类型检查似乎丢失。我希望这会引发一个错误:在typescript中展开运算符剥离类型定义,typescript,Typescript,我在打字稿中遇到了这种奇怪的现象。使用spread运算符时,类型检查似乎丢失。我希望这会引发一个错误: 接口输入{ 弦:弦; 事情二:数字; 细树:细绳; 第四:布尔; 第五:数组 } 接口输出{ 细树:细绳; 第四:布尔; 第五:数组 } const transformFunction=(输入:输入):输出=>{ 常量结果:输出={ …输入, thingFour:!input.thingFour } 返回结果 } 我正在将result键入为Output,但将Input类型的对象分散到其中显然
接口输入{
弦:弦;
事情二:数字;
细树:细绳;
第四:布尔;
第五:数组
}
接口输出{
细树:细绳;
第四:布尔;
第五:数组
}
const transformFunction=(输入:输入):输出=>{
常量结果:输出={
…输入,
thingFour:!input.thingFour
}
返回结果
}
我正在将
result
键入为Output
,但将Input
类型的对象分散到其中显然会产生一个与Output
类型不同的结果。为什么typescript没有捕捉到这一点?我们希望在这里触发typescript的特性。这个特性告诉我们,如果我们显式地提到对象类型,那么如果对象中有额外的属性,TypeScript会警告我们。不幸的是,它只适用于对象文本
例如:
const transformFunction=(输入:输入):输出=>{
返回{
thingOne:“字符串;”,
事情二:123,
ThingTree:“字符串;”,
thingFour:!input.thingFour,
第五点:[1,23],
};
};
警告:
类型“{thingOne:string;thingTwo:number;thingtree:string;thingFour:boolean;thingFive:number[];}”不能分配给类型“Output”。
对象文字只能指定已知属性,而类型“Output”中不存在“thingOne”。
exces财产检查似乎不包括spread operator案例。请看这里:
这是超额属性检查。根据@RyanCavanaugh的说法,它更像是一根短绒,而不是字体系统的一部分。但正如你所注意到的,并不是每一个案例都包含在这张支票中
他们还提到在这里查看正在进行的精确类型转换:函数的类型正确,因为类型
输入
可以分配给类型输出
,而不会出现问题,即使它有额外的属性。仅对于文字对象,存在多余属性检查,因为对象文字中多余的属性很可能是错误的。考虑这个常数,例如:
const o: {a: number} = {a: 1, b: 2}
由于
o
现在有类型{a:number}
,没有类型化的方法来访问b
属性,因此TypeScript认为这是一个错误。Input
可分配给Output
,因为类型可以有其他属性。您只需返回input
,而不是传播它,这也会起作用。您介意详细说明一下吗?例如,在…@Cerberus中,这不能证明为什么不触发。OP已经明确提到了输出类型为什么result3
起作用,而其他类型的错误?也许你可以解释一下,或者让我参考一些文档,关于如何将一种类型分配给另一种类型?此外,我不能只返回输入
,因为我正在将其展开,然后修改一个属性(因此转换函数的全部原因)。这是答案之一,但非常不满意lol。我阅读了这些讨论。真傻。希望在不久的将来,typescript能够解决这个问题。谢谢你帮我了解发生了什么事。是的,我也有点失望感谢……这有助于巩固问题的核心,即扩展运算符不包括在多余的属性检查中:(