typescript - 为什么 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
同时提供T
和P
类型时,TypeScript 强制我使用与类型createTestAction1
匹配的参数进行调用P
。这是我所期望的。
当我在createActionCreator
不提供 的情况下调用时P
,或者即使我明确提供了P
as undefined
,TypeScript 也会强制我调用createTestAction2
withundefined
作为参数。我希望能够在没有参数的情况下调用它。
如果有人能帮助我理解它为什么会这样以及如何解决它,我将不胜感激。提前致谢。
解决方案
该函数(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`
});
推荐阅读
- java - 泛型中的类型擦除和代码生成
- python - 如何在 TensorFlow 中进一步优化卷积神经网络
- elasticsearch - 如何设置elasticsearch防火墙规则
- wordpress - 如何锁定在管理区域创建的 WooCommerce 日期
- terraform - 如何使用terraform在ec2实例中创建mysql数据库
- groovy - 如何使用 XMLParser() 进行元素存在检查
- javascript - 如何在 amchart v3 中包装 categoryAxis 文本?
- sql - SQL:按日期顺序排列 Month_year
- java - Apache Ignite 缓存原子性模式不匹配
- android - Electron 移动应用的自动化框架