【发布时间】:2021-11-12 20:53:22
【问题描述】:
缩小联合类型的范围没有得到预期的结果。这是一个捕捉问题的 sn-p:
interface A {
a : number;
}
interface B {
b : string;
}
const isAnA = (arg : A | B) : arg is A => {
return "a" in arg;
}
const applyFunc = <T>(func : (x : T) => number, arg : T) => {
return func(arg)
}
const doTheThing = (arg : A | B) => {
let f;
if (isAnA(arg)) {
f = (x : A) => x.a * 2;
} else {
f = (x : B) => parseInt(x.b) * 2;
}
return applyFunc(f, arg);
}
我期望在这里发生的是isAnA() 类型保护会让编译器知道f 的类型为(x : A) => number 如果arg 是A,并且类型(x : B) => number 如果arg 是一个B,允许在arg 和f 上同时调用applyFunc。
但是,我从编译器中得到了这个:
Type '(x: B) => number' is not assignable to type '(x: A) => number'.
Types of parameters 'x' and 'x' are incompatible.
Property 'b' is missing in type 'A' but required in type 'B'.
除了明确地对applyFunc 的调用进行类型保护之外,还有什么方法可以让这个工作正常进行吗?
【问题讨论】: