我想使函数的最后一个arg有条件地可选,例如。如果前一个参数的类型为null,则使最后一个为选项(?
);如果前一个参数的值为,则使最后一个为arg。
这可能吗?
答案 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
这些都应该为您工作。希望能有所帮助;祝你好运!
答案 1 :(得分:0)
我认为最好将其表示为两个互斥的参数对象。您可以定义函数期望的两种(或更多)类型。
null
。为简便起见,我还将使该值成为可选值:interface SingleParamObject {
param1?: null
}
null
:interface TwoParamObject<T1, T2> {
param1: NonNullable<T1>,
param2: T2
}
至少可以为这种情况输入更多信息,但我认为它可以更全面地解决该问题-您要么要传递一个缺少param1
或{ {1}},或者您同时需要null
和param1
:
param2
这使您要表达的内容更具表达力,还可以为参数对象添加更多形状-也许您什么都不想要,或者const func = <T1, T2>(params: SingleParamObject|TwoParamObject<T1, T2>) => {};
+ param1
或param2
+ { {1}} + param1
+ param2
,或您想要的任何组合。