【发布时间】:2022-10-05 04:55:41
【问题描述】:
打字稿有conditional types。但是当我尝试在运行时使用泛型类型关联属性来分支一些处理逻辑时,我得到了以下类型错误。我想知道如何根据 multiple 属性的类型进行正确的类型推断?
type Value<T> = T extends undefined | false ? number : Array<number>
interface Props<T> {
multiple: T
onChange: (value: Value<T>) => void
}
function foo<T>(props: Props<T>) {
if (props.multiple) {
props.onChange([1, 2]) // Error: Argument of type \'number[]\' is not assignable to parameter of type \'Value<T>\'.
} else {
props.onChange(1) // Error: Argument of type \'number\' is not assignable to parameter of type \'Value<T>\'.
}
}
顺便说一句,当我为 T 指定 false 时没有错误
function bar(props: Props<false>) {
props.onChange(1)
}
-
泛型条件类型很难使用。 TypeScript 不会通过控制流分析来缩小或重新限制泛型类型参数。检查
if (props.multiple) {}可以对props产生影响,但确实如此没有什么到T。这导致了各种 GitHub 问题建议,例如 ms/TS#33014 和 ms/TS#33912,但到目前为止还没有任何处理它的地方。 -
@jcalz歧视工会非常适合我的用例。欢迎回答以结束这个问题。还要感谢猫。
-
好的,有机会我会写一个答案。
标签: typescript conditional-types