javascript - 打字稿条件函数签名 - 基于选项中的布尔值
问题描述
使用似乎相关的部分功能实现进行编辑:
我有这个功能:
mergeArrayElement<T>(
array: T[],
element: T | PartialDeep<T>,
options?: {
overwriteMerge?: boolean
}
) {
const index = list.findIndex(...);
if (index > -1) {
if (options.overwriteMerge) {
list[index] = element; // type error can't assign PartialDeep<T> to T.
} else {
list[index] = deepmerge(list[index],element);
}
}
}
该函数取 的一个元素partial type T
,用一些不相关的逻辑在数组中找到目标元素,并将其合并。
我希望这个函数有一个选项,它做同样的事情,但不是合并它只是覆盖元素,我称之为overwriteMerge
但实际上,没有合并它。
I want that when options overwriteMerge
is given as true, the element will be required and type-checked to be T
(and recognized as such in the function by typescript), And when overwriteMerge
is false (or not given) then the element will have to be PartialDeep<T>
.
打字稿可以做到这一点还是我需要其他功能?如果我只是定期合并元素,我可以接受该对象只是列表中对象的部分类型。但如果我只是覆盖数组中的元素,我希望它是完全相同类型的数组。
解决方案
使用方法重载
因为寻求示例DeepPartial
已被替换为Partial
function mergeArrayElement<T>(array: T[], element: T, options?: { overwriteMerge?: true });
function mergeArrayElement<T>(array: T[], element: Partial<T>, options?: { overwriteMerge?: false });
function mergeArrayElement<T>(
array: T[],
element: T | Partial<T>,
options?: { overwriteMerge?: boolean }
) {
if (options?.overwriteMerge) {
// implementation 1
} else {
// implementation 2
}
}
这将导致
type X = { a: number, b: number };
mergeArrayElement<X>([], { a: 1, b: 2 }, { overwriteMerge: true })
mergeArrayElement<X>([], { a: 1 }, { overwriteMerge: true }) // invalid
mergeArrayElement<X>([], { a: 1, b: 2 }, { overwriteMerge: false })
mergeArrayElement<X>([], { a: 1 }, { overwriteMerge: false })
推荐阅读
- python - 将参数传递给 cursor.execute() 时,pyodbc 中的 UnicodeDecodeError,但在将参数直接写入字符串时没有
- sql-server - MS Flow:SQL Server Get_rows - 我们无法将运算符 < 应用于 DateTimeZone 和 DateTime 类型
- ruby-on-rails - Rails:为什么这个连接查询失败了?
- arrays - x86 程序集任务中超出范围的数组元素的内容
- apache - Gremlin 重复直到在 path() 上返回边缘
- c++ - C++异常处理内部循环不起作用
- c++ - timeGetTime 是衡量游戏循环时间的好方法吗?
- json - 我可以使用 Domino10 NotesJson 对象修改 JSON 树吗?
- sql - PDO - CREATE 和 DROP 语句可以在同一个查询中吗?
- postgresql - 是否可以将 Debezium 连接到 9.6 以上版本的 Postgres 从站?