Typescript条件参数联合类型

时间:2018-01-30 15:18:29

标签: typescript typescript-typings

我尝试创建一个接受固定数量类型参数的函数,但根据第一个参数,顺序参数类型是不同的。

到目前为止,我还没能在Typescript文档中找到任何相关信息。

实施例

extern

2 个答案:

答案 0 :(得分:4)

您可能想要overload函数签名:

function myFunc(name: 'one', data?: 1);
function myFunc(name: 'two', data?: 2);
function myFunc(name: 'one' | 'two', data?: 1 | 2) {
  //
}

// Okay
myFunc('one', 1)
myFunc('two', 2)
myFunc('two')

// Does throw an error
myFunc('one', 2)
myFunc('two', 'string')

可能还有一种方法可以使用generic功能来实现这一点,但重载是执行您之后所做的最直接的方式。我真的建议您阅读有用且可访问的TypeScript handbook,以便深入了解此类内容。

希望有所帮助;祝你好运!

答案 1 :(得分:1)

正如jcalz在his answer中提到的,你实际上可以通过使用泛型和将使用TypeScript 2.8发布的新conditional types功能来实现这一目标。

如果您使用的是基于npm的项目,可以通过安装这样的最新夜间版本在本地试用(如果您只想在本地项目中安装-g,则可以省略它): / p>

npm install -g typescript@next

代码如下所示:

// the parens around the conditional expression are optional
function myFunc<T1 extends 'one' | 'two', T2 extends (T1 extends 'one' ? 1 : 2)>(name: T1, data?: T2) {
  // do what you want
}

// No errors
myFunc('one', 1);
myFunc('two', 2);
myFunc('two');

// All of these cause a compile error
myFunc('one', 2);
myFunc('two', 1);
myFunc('three');
myFunc('two', 'string')
myFunc('one', 3);

// the first invocation (i.e. myFunc('one', 1)) leads to this resolved type
function myFunc<"one", 1>(name: "one", data?: 1 | undefined): void