Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在typescript中展开运算符剥离类型定义_Typescript - Fatal编程技术网

在typescript中展开运算符剥离类型定义

在typescript中展开运算符剥离类型定义,typescript,Typescript,我在打字稿中遇到了这种奇怪的现象。使用spread运算符时,类型检查似乎丢失。我希望这会引发一个错误: 接口输入{ 弦:弦; 事情二:数字; 细树:细绳; 第四:布尔; 第五:数组 } 接口输出{ 细树:细绳; 第四:布尔; 第五:数组 } const transformFunction=(输入:输入):输出=>{ 常量结果:输出={ …输入, thingFour:!input.thingFour } 返回结果 } 我正在将result键入为Output,但将Input类型的对象分散到其中显然

我在打字稿中遇到了这种奇怪的现象。使用spread运算符时,类型检查似乎丢失。我希望这会引发一个错误:

接口输入{
弦:弦;
事情二:数字;
细树:细绳;
第四:布尔;
第五:数组
}
接口输出{
细树:细绳;
第四:布尔;
第五:数组
}
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能够解决这个问题。谢谢你帮我了解发生了什么事。是的,我也有点失望感谢……这有助于巩固问题的核心,即扩展运算符不包括在多余的属性检查中:(