我尝试创建一个接受固定数量类型参数的函数,但根据第一个参数,顺序参数类型是不同的。
到目前为止,我还没能在Typescript文档中找到任何相关信息。
extern
答案 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