协方差/反对方差中的意外行为,如打字稿的分配

时间:2016-01-12 04:02:25

标签: typescript covariance contravariance

我是打字稿的新手,我发现了一些关于协方差/反方差的意外行为。

这是一段代码:

interface Func1 {
    (): { prop1: string }
}

// assignment similar to covariance
var f1: Func1 = function () { return { prop1: "", prop2: 0 }; }

interface Func2 {
    ({prop1: string, prop2: number}): void;
}

// assignment similar to contra-variance
var f3: Func3 = function (a: { prop1: string }) { }

interface Func3 {
    ({prop1: string}): void;
}

// assignment violates principle of contra-variance.
// expect a compiling error but there isn't.
var f3: Func3 = function (a: { prop1: string, prop2: number }) { alert(a.prop2); }

// here occurs a non-existing field accessing
// it might be unexpected and was possible to be eliminated by static checking on assignment to 'f3'.
f3({ prop1: "" }); 

赋值给f1是可以的,因为匿名函数的返回值可以赋值为Func1的返回值类型。

对f2的赋值也是可以的,因为馈送到Func2类型的参数可以分配给匿名函数的参数'a'。

对f3的赋值应该失败,因为无法将赋予Func3类型的参数赋值给匿名函数的参数'a',所以我希望编译器引发错误,但实际上并没有。

这会在调用f3时导致意外的访问冲突。

我的问题是,是预期的行为还是打字稿设计/实现的缺陷?

1 个答案:

答案 0 :(得分:1)

  

//赋值违反了反方差原则。   //期待编译错误,但没有。

这是常见问题,并记录在案:https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Type%20Compatibility.md#function-argument-bivariance

基本上它可以方便地添加事件监听器(如果语言将滑块拉向安全的话,这是一个很难移植到TypeScript的相当常见的JS任务)