javascript - TypeScript:没有显式返回类型的 lambda 不会检查多余的属性
问题描述
在下面的示例中,我试图弄清楚为什么我的输入适用于我的对象的所有部分,除了我的减速器返回类型?
如果我明确设置:reducer: (state, action): CounterState
编译器抱怨(如预期的那样)我没有返回正确的状态。问题是,我不明白为什么我必须这样做,因为我已经在我的Config
类型中强制执行此操作?
简化示例:
interface CounterState {
counter: number;
}
type Reducer = () => CounterState
const reducer1: Reducer = () => ({
counter: 1,
foo: 'bar' // no errors, why?
})
const reducer2: Reducer = (): CounterState => ({
counter: 1,
foo: 'bar' // error: Object literal may only specify known properties
})
解决方案
最后我在 GitHub 中找到了这个问题,正是关于这个问题。简而言之:
理想情况下,这将是一个错误。不幸的是,在不影响递归失控和/或性能的情况下,很难解决这个问题
原始答案: 从 typescript 1.6 开始,对象文字不能有额外的属性。但是,如果将对象强制转换为类型,则允许使用额外的属性。例如:
const state: CounterState = {
counter: 1,
foo: "bar" // Error, unknown property 'foo'
};
const state2 = {
counter: 1,
foo: "bar" // no errors
} as CounterState
它看起来与您的问题非常相似,当您明确指定 lambda 返回类型时,将应用第一条规则。但是,如果没有指定返回类型,编译器会认为:“好吧,也许我可以将对象强制转换为 CounterState……可以吗?我不确定……但是,我会尝试!” ,并应用第二条规则。
但是我不能参考任何描述这种行为的文档或编译器规范,我也没有找到它。
推荐阅读
- xml - XML 模式 - 没有可用于验证根的匹配全局声明
- c# - 从 c# WPF 代码自动登录到 WEB 浏览器
- azure-devops - Azure Pipeline Function App - 部署单个 DLL 而不是完整的应用程序
- postgresql - Postgres 条件聚合数组
- twitter-bootstrap - Bootstrap 下拉菜单扩展了固定顶部导航栏的高度
- python-3.x - 如何在for循环中使用if条件?金贾
- jquery - JQuery .html() 没有正确返回自闭合标签
- python - Pytest 模拟通过 yield 返回的对象并检查该对象的方法是否被调用
- asp.net-mvc - 在生产中显示 DeveloperExceptionPage 但仅用于“远程”
- matlab - Matlab中的wdenoise-这是2D还是3D过滤器?