我有一个函数可以被调用为
myFunc("")
myFunc({}, {}) // two different objects
它也可以被称为
myFunc("", {})
在这种情况下,第二个参数被简单地忽略。
如果第一个参数是obj
而不是字符串,我希望防止在没有第二个参数的情况下调用它
myFunc({}) // should type error
我是这样实现的
type SomeType = { name: string }
type SomeOtherType = { config: number }
function myFunc(firstArg: string | SomeType, secondArg?: SomeOtherType): number {
if (typeof firstArg === "string") {
return doStringStuff(firstArg)
}
if (secondArg === undefined) {
throw new Error('secondArg must be defined when firstArg is SomeType')
}
return doObjStuff(firstArg, secondArg)
}
(其中doStringStuff()
和doObjStuff()
都返回数字),但是有没有更好的方法呢?在类型级别?
2条答案
按热度按时间h43kikqp1#
看起来函数重载在这里起作用了,甚至对于变量参数计数(沙箱)也令人惊讶:
ttvkxqim2#
可以使用重载来确保在TypeScript中不能使用
string
和SomeTye
进行调用:您还可以在rest参数中使用元组的并集来帮助TypeScript理解参数之间的关系:
Playground链接
元组的并集在调用点的作用类似于重载,因此调用方不会暴露给元组