我有一个不同参数的打字稿函数声明:
function f(): void;
function f(code: 0): void;
function f(code: 1, msg: string): void;
function f(code: 0 | 1 = 0, msg?: string): void { /* omit implementation */ }
因此,它可以调用为:
f() // ok
f(0) // ok
f(1, "error message") // ok
f(0, "message") // type error
f(1) // type error
我的问题是如何在不使用函数重载的情况下重构此函数声明? (例如,使用联合类型、条件类型等(
下面介绍如何使用联合类型键入参数组合:
function f(...args: [] | [0] | [1, string]): void { /* omit implementation */ }
操场
*带有重载的版本看起来仍然干净得多。
这个呢?
type Message = {code: 0 } | {code: 1, messageText?: string};
const useMessage = (message?: Message) => {};
const usedMessage_0 = useMessage();
const usedMessage_1 = useMessage({code: 0});
const usedMessage_2 = useMessage({code: 1});
const usedMessage_3 = useMessage({code: 0, messageText: 'something'}); // type error
const usedMessage_4 = useMessage({code: 1, messageText: 'something'});