首页 > 解决方案 > 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
})

标签: javascriptreactjstypescriptredux

解决方案


最后我在 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……可以吗?我不确定……但是,我会尝试!” ,并应用第二条规则。

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


推荐阅读