typescript - 基于条件类型的可选参数

标签 typescript types conditional-types

是否可以根据 TypeScript 中的条件类型使函数具有强制参数或可选参数?

这是我目前所得到的:

const foo = <T extends string | number>(
    first: T,
    second: T extends string ? boolean : undefined
) => undefined;

foo('foo', true); // ok, as intended
foo(2, true); // not ok, as intended
foo(2, undefined); // ok, as intended
foo(2); // compiler error! I want this to be ok

最佳答案

您可以在 3.1 中使用 Tuples in rest parameters and spread expressions 执行此操作

const foo = <T extends string | number>(
  first: T, 
  ...a: (T extends string ? [boolean] : [undefined?])
) => undefined;

foo('foo', true); // ok, as intended
foo(2, true); // not ok, as intended
foo(2, undefined); // ok, as intended
foo(2); // ok

但更好的方法是使用重载。

function foo2(first: string, second: boolean) : undefined
function foo2(first: number, second?: undefined): undefined
function foo2<T>(first: T, second?: boolean): undefined{
  return undefined
}

foo2('foo', true); // ok, as intended
foo2(2, true); // not ok, as intended
foo2(2, undefined); // ok, as intended
foo2(2); // ok

关于typescript - 基于条件类型的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52318011/

相关文章:

typescript - TypeScript 中 NonNullable<T> 的定义

javascript - 我可以让 TypeScript 包含 node_modules 以进行编译吗?

angular - 在 TypeScript 中创建 GUID - 函数在 JS 中有效但在 TS 中无效

c - GCC:为什么这个 fprintf 有一个 -Wformat 警告?

sql - Oracle - 存储特定长度数字的数据类型

javascript - 将条件类型映射回联合类型?

javascript - Express.js - 在请求对象中通过主体转换接口(interface)

javascript - 是否可以验证单个路由参数?

struct - 如何将来自不同 HashMap 的字段合并为一个?

typescript - 根据枚举值有条件地禁止函数参数