2016-08-01 84 views
0

让我们说我们有这样的代码:兼容类型的函数

class MyEvent { 
    timestamp:number; 
} 
class AEvent extends MyEvent{ 
    x:number; 
    y:number; 
} 
class BEvent extends MyEvent{ 
    key:string; 
} 
var fn:(event:MyEvent)=>void; 
function AE(event:AEvent){ 
    let x = event.x; //Ok, but BEvent hasn't 'x' property. 
} 
fn = AE; 
fn(new BEvent()); 

打字稿不告知错误。打字稿是一个有效的代码。 我曾尝试过在打字游乐场。 (1.8版本)

如何强制打字稿禁止打印?

例如,在C++

class Base { 
    public: 
     int timestamp; 
}; 

class B: public Base { 
    public: 
     char key; 
}; 
class A: public Base { 
    public: 
     int x; 
     int y; 
}; 


void fA(A *ptr) {} 

void (*fn)(Base *ptr); 


int main() 
{ 
    A *a = new A(); 
    B *b = new B(); 

    fn = fA; //error: invalid conversion from 'void (*)(A*)' to 'void (*)(Base*)' 
    fn(b); 
} 

回答

2

该函数的参数是双变量,以允许即使在一些罕见的病例发生一些运行时错误常见的JavaScript图案。

根据compatibility handbook类型:

当比较类型的函数的参数,分配成功 如果源参数是分配给所述目标参数, 或反之亦然。这是不合适的,因为调用者可能最终得到 给定一个函数,该函数采用更专门化的类型,但调用 函数的专用类型较少。实际上,这种类型的错误 很少见,并允许启用许多常见的JavaScript模式。

Why are function parameters bivariant?

综上所述,在打字稿类型的系统中,一个 更特异型接受功能是否应该分配给一个 函数接受无特定类型提供的问题一个先决条件回答 指出是否可将更具体类型的数组分配给 一个不太特定类型的数组。后者不是 在绝大多数情况下都不是可接受的类型系统,因此我们必须针对 函数参数类型的具体情况进行正确性权衡。

+0

很好的答案。我的结论是,我的情况是'某些运行时错误可能发生在极少数情况下。“ – Oleg