这是一个接收两个模板的界面。返回的函数应该是其中一个模板的一部分(这是对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
并且该服务并未抱怨此事。
我在这里做错了什么?
答案 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.
。此规则不适用于函数返回值。