TypeScript:子类中的抽象属性缺少类型信息

时间:2019-04-04 17:12:46

标签: typescript

我正在使用TypeScript 3.4,以下代码有一个奇怪的问题

interface MyInterface {
  fn: (x: number) => number;
}

abstract class A {
  abstract prop: MyInterface;
}

class B extends A {
  prop = { fn: x => x }; // complains about x having implicit any here
}

TypeScript抱怨我的函数具有隐式any参数。现在当我像这样写B类时

class B extends A {
  prop: MyInterface = { fn: x => x }; // does not complain anymore!
}

问题消失了,TypeScript知道x是一个数字。通常,TypeScript在我的示例中知道prop的类型为MyInterface,但是对于函数来说,它无法正常工作。

有人可以向我解释我做错了什么吗?这是重现此问题的最小示例。在我的实际代码中,我将所有内容都拆分到了不同的文件中,并且必须在抽象类的每个实现中都导入相应的MyInterface

1 个答案:

答案 0 :(得分:2)

这是一个known design limitation of TypeScript,由于“无法解决”而被关闭。您期望class B extends A的{​​{1}}的{​​{3}}属性初始化程序被约束为B的相应属性的类型,但这并没有真正发生。

contextually type,但显然它破坏了太多现有代码,不值得。 efforts to fix it @sandersn

  

不幸的是,我们无法提供既一致又向后兼容的解决方案。我们在“真实世界”代码套件中的漏洞弊大于弊。

因此,您似乎必须手动输入。避免导入属性类型名称的一种方法是使用said,如下所示:

A

在这种情况下,类型class B extends A { prop: A['prop'] = { fn: x => x } } 被解析为A['prop']

无论如何,希望能有所帮助。祝你好运。