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