部分模板模板的行为不符合预期

时间:2017-04-13 07:47:47

标签: javascript typescript

这是一个接收两个模板的界面。返回的函数应该是其中一个模板的一部分(这是对React-Redux的一种看法):

export type IState<TState, TOwnProps> = {
    connect: (mapStateToProps: MapStateToProps<TState, Partial<TOwnProps>>) => () => any;
}
export type MapStateToProps<TState, TStateProps> = (state: TState) => TStateProps;

现在,这是一个想要使用它的状态示例:

interface IAppState {
    services: string[]
}

interface IAppProps {
    services: string[];
    count: number;
}

const MyState: IState<IAppState, IAppProps>;
MyState.connect(
    (state) => {
        return {
            services: state.services,
            foo: null
        }
    }
);

MyState.connect应该期待一个函数(它确实如此)。参数应该是IAppState类型(它是)。但回报假设为Partial<IAppProps>。但是,正如您所看到的,我也将返回foo: null并且该服务并未抱怨此事。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

如果您尝试这样做:

MyState.connect(
    (state) : Partial<IAppProps> => {
        return {
            services: state.services,
            foo: null
        }
    }
);

编译器开始抱怨。这里发生的是以下内容:

内部lambda函数的类型推断为() => {services:IAppState, foo:null}。并且这可以作为参数传递,因为它与() => Partial<IAppProps>兼容(它具有所有必需的字段。)因此编译器不比较对象文字的类型,而是比较函数的类型

严格地说,即使const x : {foo:number} = {foo:1, bar:2};也是类型安全的,因为该值具有所有必需的属性。但通常在编写对象文字时需要进行更严格的检查,这就是为什么打字稿有一个额外的规则:Object literal may only specify known properties.。此规则不适用于函数返回值。