使最后一个参数成为条件可选的打字稿

时间:2019-10-07 08:41:22

标签: typescript

我想使函数的最后一个arg有条件地可选,例如。如果前一个参数的类型为null,则使最后一个为选项(?);如果前一个参数的值为,则使最后一个为arg。

这可能吗?

这里的游乐场: https://typescript-play.js.org/#code/MYewdgzgLgBAZgVzMGBeGAeAKgRgDQxYBMAfABQAOAhgE5UC2OAXIfjNXfUS7jAKYAPKHzAATCDDAIANtJgB+SXwBufGjxwBKNCRgBvAL4BuAFAmA9OZgALNXxg0+ARwQBLRzFoBzE4mRkAcilZAM1TCytbRwIwEFhHF3d7Yl8kYDJg6TCTIA

2 个答案:

答案 0 :(得分:1)

您可以使用rest tuples的并集来实现此行为:

const func = (...param: [null, unknown?] | [unknown, unknown]) => {};

func("a", "b"); // okay
func("a"); // error!  Type 'string' is not assignable to type 'null'.
func(null); // okay
func(null, "b"); // okay

或者,您可以使用传统的(TS3.0之前的)解决方案overloads

const func: {
  (param1: null, param2?: unknown): void; // first call signature
  (param1: unknown, param2: unknown): void; // second call signature
} = (param1: unknown, param2?: unknown) => {};

func("a", "b"); // okay
func("a"); // error!  Type '"a"' is not assignable to parameter of type 'null'.
func(null); // okay
func(null, "b"); // okay

这些都应该为您工作。希望能有所帮助;祝你好运!

Link to code

答案 1 :(得分:0)

我认为最好将其表示为两个互斥的参数对象。您可以定义函数期望的两种(或更多)类型。

  • 一个将只有一个值,该值为null。为简便起见,我还将使该值成为可选值:
interface SingleParamObject {
    param1?: null
}
  • 下一个类型具有两个参数,并规定第一个不是null
interface TwoParamObject<T1, T2> {
    param1: NonNullable<T1>,
    param2: T2
}

至少可以为这种情况输入更多信息,但我认为它可以更全面地解决该问题-您要么要传递一个缺少param1或{ {1}},或者您同时需要nullparam1

param2

这使您要表达的内容更具表达力,还可以为参数对象添加更多形状-也许您什么都不想要,或者const func = <T1, T2>(params: SingleParamObject|TwoParamObject<T1, T2>) => {}; + param1param2 + { {1}} + param1 + param2,或您想要的任何组合。

Check on TypeScript Playground