typescript重载忽略第二个选项



我有以下方法签名:

class Foo<T> {
sanitize (value: unknown): returnPrimitive<T>
sanitize (value: unknown[]): returnPrimitive<T>[]
sanitize (value: unknown | unknown[]): returnPrimitive<T> | returnPrimitive<T>[] {
// ...
}
}
type returnPrimitive<T> =
T extends String ? string
: T extends Number ? number
: T extends Boolean ? boolean
: T

无论我如何调用这个方法,IntelliSense都不会认为它应该返回一个数组:

const a = new Foo<Number>().sanitize('5') // returns number
const b = new Foo<Number>().sanitize(['5']) // returns number instead of number[]

我是不是做错了什么?

在typescript操场上尝试过这个。我怀疑发生这种情况是因为unknown包含unknown[]

然而,如果我改变更精确的定义,我会得到你想要的行为:

class Foo<T> {
sanitize (value: unknown[]): returnPrimitive<T>[]
sanitize (value: unknown): returnPrimitive<T>
sanitize (value: unknown | unknown[]): returnPrimitive<T> | returnPrimitive<T>[] {
return 'foo' as any;
}
}

检查它是否适用于

class Foo<T> {
sanitize<S extends any | any[]>(value: S): Check<T, S> {
return 'foo' as any
}
}
type Check<T, S> = S extends any[]
? returnPrimitive<T>[]
: returnPrimitive<T>
type returnPrimitive<T> = T extends String
? string
: T extends Number
? number
: T extends Boolean
? boolean
: T
const a = new Foo<Number>().sanitize('5') // number
const b = new Foo<Number>().sanitize(['5']) // number[]

相关内容

最新更新