我试图定义一个可与多个参数或单个对象调用的函数。单对象就是所支持的参数的容器。
这是我尝试的例子:
export type ExecutionArgs = {
input: Observable<string>,
whatever: SomeOtherType,
foo?: string,
bar?: number,
};
function execute(
args: ExecutionArgs,
...rest: any[]
): Observable<string>;
function execute(
input: Observable<string>,
whatever: SomeOtherType,
foo?: string,
bar?: number,
): Observable<string>;
function execute(
inputOrArgs,
whatever,
foo,
bar,
) {
// Extract arguments from object args if provided.
if (arguments.length === 1) {
return doThings(
inputOrArgs.input,
inputOrArgs.whatever,
inputOrArgs.foo,
inputOrArgs.bar,
);
}
return doThings(
inputOrArgs,
whatever,
foo,
bar,
);
}
当调用我的函数,正确地检测类型。在下面的线,我得到input
和bar
预期的错误。
execute('a', 'b', 'c', 'd');
execute({ input: 'a', whatever: 'b', foo: 'c' bar: 'd' });
但在我的功能本身,当我将鼠标悬停我的变量或对象的道具,打字稿只检测到处键入any
。
如何正确地写我的功能?
你遇到的是2个问题,打字稿的组合:
any
里面的函数重载函数,因为你不指定它们。arguments
对象没有类型的,即所有参数都any
;通过使用一个元组的工会指定超载就可以解决这两个问题:
type ExecuteArgs =
| [Observable<string>, SomeOtherType, string?, number?]
| [{
input: Observable<string>,
whatever: SomeOtherType,
foo?: string,
bar?: number,
}]
function execute(
...args: ExecuteArgs
) {
// Extract arguments from object args if provided.
if (args.length === 1) {
const [{ input, whatever, foo, bar }] = args;
return doThings(
input,
whatever,
foo,
bar,
);
}
const [input, whatever, foo, bar] = args;
return doThings(
input,
whatever,
foo,
bar,
);
}