TypeScript中的多态:宽松类型

问题描述

我对打字稿中的多态性有疑问。请看下面的代码:

type A = { a: 'a' };
type B = { b: 'b' };

interface Lib {
    method(arg: A): void;
    method(arg: B): void;
}
declare const lib: Lib;

type C = A | B;
declare const c: C;

lib.method(c); // error

'a' in c 
  ? lib.method(c) // no error
  : lib.method(c); // no error either

如您所见,即使可以,我们也不能仅致电lib.method(c)。因为TS不会将我的参数与组合函数签名进行比较。随后,它会检查每个过载情况。但是,当我将价值分成几个简单的部分时,它会很好地工作。

但是...我的工作代码... ? fn(c) : fn(c)看起来不是完全白痴吗? :-)

问题是-如何处理此类情况?我在react-router中使用他们的push方法来面对它。我只看到下一个解决方案:

  1. 用一种新的宽容类型覆盖它们的重载类型
  2. 到处写... ? fn(c) : fn(c)之类的代码
  3. 用我自己的签名写我自己的包装器
  4. fn(c as unknown as any)

还有什么更好的吗? :)问题的根源是什么?

解决方法

正如@ritaj上面所写-这是TS社区中的一个众所周知的问题。主要讨论在那里:https://github.com/Microsoft/TypeScript/issues/14107

目前没有最佳解决方案。因此,我使用了最方便的方法-我覆盖了损坏的接口,添加了更宽的类型。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...