信息: 在Jetbrains Rider中使用打字稿3.3.3333
给出Reducer<State, Action>
的这种类型的定义:
* @template S The type of state consumed and produced by this reducer.
* @template A The type of actions the reducer can potentially respond to.
*/
export type Reducer<S = any, A extends Action = AnyAction> = (
state: S | undefined,
action: A
) => S
为什么除非我明确定义了S
的返回类型,否则不检查我从化简器返回的状态?
export const INITIAL_STATE: AuthenticationState = {
authenticationInProgress: false,
accessToken: null,
tokenType: null,
expiryTimeMs: null,
errorInformation: null,
isAdmin: false,
};
export const authenticationReducer: Reducer<AuthenticationState,
AuthenticationActions> = (state = INITIAL_STATE, action):
(why is this necessary??) -> AuthenticationState => {
switch (action.type) {
case "authentication/user_authentication_request": {
return {
...state,
problem -> hello: "hi",
authenticationInProgress: true,
};
}
...
我期望的行为而无需将AuthenticationState定义为返回值
VS。
如果Reducer Type包含S的返回值,为什么不再对返回值进行类型检查?
任何欢迎我们的光和智慧。预先感谢。
答案 0 :(得分:1)
TLDR :由于多余的属性检查的工作方式,这是TypeScript中的预期行为。
在您的情况下,您定义的箭头函数的返回类型具有多余(或多余)的属性。对于TypeScript,这完全可以。
在一个简化的示例中,请看一下这种行为:
type a = () => { a: string };
type b = () => { a: string, b: string };
declare let myA: a;
declare let myB: b;
myA = myB; // OK! (excess properties are not checked)
myB = myA; // Error: missing required property 'b'
问题的症结在于,您实际上是将myB
分配给myA
并期望出现错误,但是只有将myA
分配给{{ 1}}。
您有几种选择可以使您的代码按预期工作(例如您所建议的那种,您在其中明确定义了返回类型),但是在TypeScript支持确切类型之前,它们都不是理想的选择(对于确切类型,有an open issue,讨论了带redux的确切用例和一些解决方法)。
答案 1 :(得分:0)