我正在使用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
。
答案 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']
。
无论如何,希望能有所帮助。祝你好运。