我在我的项目中有一个库,我停止使用(从package.json
中删除),它的对等依赖之一是fp-ts
,所以我必须将fp-ts
添加到我的项目中。fp-ts
有一个Either
类型,可以检查左/右值:
export declare const isLeft: <E>(ma: Either<E, unknown>) => ma is Left<E>
字符串
如果我把这个放进if
if (E.isLeft(result)) {
// ...
}
型
那么在else
中,Typescript将正确地推断出我的Either
有一个right
值。
我的问题是,自从我将依赖项移动到我的项目(而不是间接地将其用作对等依赖项)之后,以下情况不再起作用,我得到了一个编译器错误:
const fail = (msg: string): never => {
throw new GenericProgramError(msg);
};
if (E.isLeft(result)) {
fail("Expected a successful result");
}
expect(result.right).toEqual(
// ^^^--- Property 'right' does not exist on type 'Left'
// ...
);
型
这里的问题是,如果result
是一个Left
,那么I fail
返回never
(抛出),所以Typescript应该能够推断出在expect
中,result
只能有一个right
,而不能有一个left
。这在以前是有效的。我需要修改什么来修复这个问题?
1条答案
按热度按时间x8diyxa71#
答案是你的
fail
Assert函数应该是一个函数语句,而不是一个胖箭头函数。(感谢大卫_p的回答:https://stackoverflow.com/a/72689922/81723)因此,只需更改为
function fail(...): never
,它就可以工作:字符串
下面是完整的工作示例:
型
为什么会这样
我转弯抹角地找到了答案。
我试图通过将您的代码更改为Assert函数来解决这个问题。
但是我得到了一个奇怪的错误:“Assert要求调用目标中的每个名称都用显式类型注解声明。
型
搜索这个错误得到了david_p's answer,这解释了你不能使用箭头函数作为Assert函数(好吧,技术上你可以,但是你需要显式定义被赋值变量的类型签名。在实践中,只使用函数语句更容易)。