Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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
Javascript TypeScript:如果没有显式返回类型,则不会在lambda中检查多余的属性_Javascript_Reactjs_Typescript_Redux - Fatal编程技术网

Javascript TypeScript:如果没有显式返回类型,则不会在lambda中检查多余的属性

Javascript TypeScript:如果没有显式返回类型,则不会在lambda中检查多余的属性,javascript,reactjs,typescript,redux,Javascript,Reactjs,Typescript,Redux,在下面的文章中,我试图弄明白为什么我的输入除了我的reducer返回类型之外,还能适用于对象的所有部分 如果我显式设置:reducer:(state,action):CounterState,编译器会抱怨(正如预期的那样)我没有返回正确的状态。问题是,我不明白为什么我必须这么做,因为我已经在我的Config类型中强制执行了这一点 简化的例子是: 接口反状态{ 柜台:号码; } 类型减速器=()=>反状态 常量减速机1:减速机=()=>({ 柜台:1,, foo:'bar'//没有错误,为什么?

在下面的文章中,我试图弄明白为什么我的输入除了我的reducer返回类型之外,还能适用于对象的所有部分

如果我显式设置:
reducer:(state,action):CounterState
,编译器会抱怨(正如预期的那样)我没有返回正确的状态。问题是,我不明白为什么我必须这么做,因为我已经在我的
Config
类型中强制执行了这一点

简化的例子是:

接口反状态{
柜台:号码;
}
类型减速器=()=>反状态
常量减速机1:减速机=()=>({
柜台:1,,
foo:'bar'//没有错误,为什么?
})
const reducer2:Reducer=():CounterState=>({
柜台:1,,
foo:'bar'//错误:对象文字只能指定已知属性
})
TypeScript中的类型兼容性基于结构子类型

设计用于允许额外属性的类型脚本。但在某些地方,我们有一些不一致的行为,它声称
对象文字可能只指定已知的属性
。这种行为更容易被预料到,但它不是一种结构性的亚型

我终于在GitHub中找到了问题所在。简言之:

理想情况下,这将是一个错误。不幸的是,结果是非常糟糕的 很难在不可能造成以下后果的情况下解决此问题: 失控递归和/或性能

原始答案: 自typescript 1.6以来,对象文字。但如果将对象强制转换为该类型,则允许使用额外的属性。例如:

const状态:CounterState={
柜台:1,,
foo:“条”//错误,未知属性“foo”
};
常量state2={
柜台:1,,
foo:“条”//无错误
}作为反陈述
这与您的问题非常相似,当您显式指定lambda返回类型时,将应用第一条规则。但是,如果没有指定返回类型,编译器会认为:“好的,也许我可以将对象强制转换为反状态……可以吗?我不确定……但是,我会尝试!”然后应用第二条规则


但是我不能参考任何描述这种行为的文档或编译器规范,我也没有找到它。

这个主题有点复杂,所以我参考了这两篇文章,而不是试图用几句话来解释这些事情谢谢!因此,当您返回对象文字时,typescript允许在对象的返回类型中未定义的其他属性。大概唯一的解决方法是显式地在函数本身上声明返回类型,以防止TS将其推断为子类型?是的,您必须显式地将其设置为更好的标题,例如:“TypeScript:在没有显式返回类型的lambda中不会检查过多的属性”?您不能从对象文本中删除
计数器,这只是属性过多的问题。谢谢@ValeriyKatkov,我已经接受了您的更改并更新了标题。@Samuel,这似乎与lambdas没有什么特别的关系,是吗?是的,作为TS的新来者,感觉有点不对,这是一个特性还是一个bug?它看起来像一个特性,这是不受欢迎的,但很难修复