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

问题描述 投票:0回答:2

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

这可能吗?

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

typescript
2个回答
0
投票

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

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

至少在this情况下需要更多输入,但我认为它可以更全面地解决该问题-您要么希望传递一个缺少param1null的参数对象,要么都希望param1param2

const func = <T1, T2>(params: SingleParamObject|TwoParamObject<T1, T2>) => {};

这使您想要做的事情更具表达力,也可以为参数对象添加更多形状-也许您什么都不想要,或者param1 + param2param1 +param2+param3+ param4或您想要的任何组合。

Check on TypeScript Playground


0
投票

您可以使用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

© www.soinside.com 2019 - 2024. All rights reserved.