2016-04-09 58 views
2

打字稿编译器接受以下代码而不发出错误信号:打字稿:在继承的方法参数类型应被推断

class S { 
    f(p: number) { 
     console.log(`${p + 1}`); 
    } 
} 

class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

let a: C = new C(); 
let b: C = new C(); 

a.f(41); // -> 42 
b.f('x'); // -> x1 

打字稿是一个静态类型语言,不应编译器推断的p参数类型在继承的方法fnumber?为什么错误的键入的字符串值的赋值未被捕获,产生奇怪的行为?

回答

2
class C extends S { 
    f(p) { 
     super.f(p) 
    } 
} 

此代码等同于下面的代码:

class C extends S { 
    f(p: any) { // <---- parameter is 'any' 
     super.f(p) 
    } 
} 

这意味着你可以调用C#f任何参数类型。这是你的班级的有效替代,因为派生方法的有效性是更多一般比其基本方法。

这种行为被理解为有点违反直觉,所以there's a feature accepting PRs for this in the language在这种情况下自动键入p作为string

+1

谢谢,瑞安,我同意替换是有效的更一般的参数。虽然,恕我直言,调用'super.f(p)'不应该被允许具有未定义类型的参数(_any_)。有没有办法强制编译器进行这种类型检查? –