首页 > 解决方案 > 为什么 TypeScript 强制我为在我的函数签名中键入为未定义的参数显式传递未定义?

问题描述

我是一名初级开发人员,我需要帮助。我试过用谷歌搜索这个问题,但我很难用正确的方式来表达它。如果问题具有误导性,请提前道歉。

当我在函数签名中将参数类型化为未定义时,有人可以帮我理解为什么 TypeScript 强制我将未定义作为参数传递给函数吗?

这就是我想要做的。我想创建一个返回动作创建函数的函数,然后返回动作对象:

interface IAction<T, P> {
    type: T;
    payload?: P;
}

const createActionCreator = <T extends string, P = undefined>(type: T) => (payload: P): IAction<T, P> => ({
    type,
    payload,
});

const THIS_IS_MY_ACTION_TYPE = '@PREFIXED/THIS_IS_MY_ACTION_TYPE';

const createTestAction1 = createActionCreator<typeof THIS_IS_MY_ACTION_TYPE, string>(THIS_IS_MY_ACTION_TYPE);

const createTestAction2 = createActionCreator<typeof THIS_IS_MY_ACTION_TYPE>(THIS_IS_MY_ACTION_TYPE);

const testAction1 = createTestAction1('some string');
// works fine

const testAction2 = createTestAction2();
// TypeScript complains that an argument was expected

当我调用createActionCreator同时提供TP类型时,TypeScript 强制我使用与类型createTestAction1匹配的参数进行调用P。这是我所期望的。

当我在createActionCreator 提供 的情况下调用时P,或者即使我明确提供了Pas undefined,TypeScript 也会强制我调用createTestAction2withundefined作为参数。我希望能够在没有参数的情况下调用它。

如果有人能帮助我理解它为什么会这样以及如何解决它,我将不胜感激。提前致谢。

标签: typescriptredux

解决方案


该函数(payload: P) => {..}有一个参数,因此 Typescript 需要一个参数,即使参数类型是undefined. 尝试使参数可选(使用?),然后= undefined从您的类型 param 中删除默认类型<P>

const createActionCreator = <T extends string, P>(type: T) =>
//                                             ^ type `P` is required
    (payload?: P): IAction<T, P> => ({
    //      ^ parameter `payload` is optional
        type,
        payload, // if not provided, will be the value `undefined`
    });

推荐阅读