【发布时间】:2019-01-04 07:45:31
【问题描述】:
我有一个函数应该能够接收两种相似类型作为参数。取决于props.multi 是true 还是false。
问题是它仍然允许我通过value = [] 和multi = false。我怎样才能摆脱它?
interface PropsSingle<T> {
value: T,
multi: false
}
interface PropsMulti<T> {
value: T[],
multi: true
}
function foo<T>(props: PropsSingle<T> | PropsMulti<T>) {
if(props.multi) {
let arr = props.value // type detection works fine
} else {
let obj = props.value // type detection works fine
}
}
foo({multi: true, value: []}) // works as expected
foo({multi: true, value: {}}) // throws error as expected
foo({multi: false, value: {}}) // works as expected
foo({multi: false, value: []}) // THIS SHOULD THROW AN ERROR
我已经尝试过foo<T extends object>(...) 和foo<T extends {[key: string]: any}>(...)
我发现的唯一一种解决方案/解决方法是:
interface PropsSingle<T> {
value: T extends any[] ? never : T,
multi: false
}
但这对我来说很奇怪。
为什么我不能限制function foo的类型?
【问题讨论】:
标签: typescript generics type-inference typescript-generics