让我解释:
arg1
必须是Type1
或Type2
arg2
必须是Type1.options
(如果arg1
是Type1
)或Type2.options
否则create(arg1: Type1 | Type2, arg2?: any) {}
可以在TypeScript中定义这个“绑定”吗?
您正在寻找overloaded function:
function create(arg1: Type1, arg2?: Type1.options);
function create(arg1: Type2, arg2?: Type2.options);
function create(arg1: Type1 | Type2, arg2?: Type1.options | Type2.options) { ... }
请注意,最后一个签名(“实现签名”)不是过载签名之一,应该足够宽以覆盖所有过载签名。你将理清函数体中的实际参数。
您可以使用generic声明来推断依赖关系,如下所示:
function create<T extends (Type1 | Type2)> (arg1: T, arg2?: T['options']) { ... }
您还可以创建一个像type ArgType = Type1 | Type2
这样的别名来简化通用约束:
function create<T extends ArgType> (arg1: T, arg2?: T['options']) { ... }