首页 > 解决方案 > 打字稿条件函数签名 - 基于选项中的布尔值

问题描述

使用似乎相关的部分功能实现进行编辑:

我有这个功能:

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 overwriteMergeis 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 overwriteMergeis false (or not given) then the element will have to be PartialDeep<T>.

打字稿可以做到这一点还是我需要其他功能?如果我只是定期合并元素,我可以接受该对象只是列表中对象的部分类型。但如果我只是覆盖数组中的元素,我希望它是完全相同类型的数组。

标签: javascripttypescript

解决方案


使用方法重载

因为寻求示例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 })

推荐阅读