covariance/contra-variance 中的意外行为,例如打字稿的分配
unexpected behavior in covariance/contra-variance like assignment of typescript
我是 typescript 的新手,我发现一些关于 covariance/contra-variance 类似行为的意想不到的事情。
这是一个代码片段:
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 是可以的,因为匿名函数的 return 值可以分配给 Func1 的 return 值类型。
分配给 f2 也可以,因为可以将输入 Func2 类型的参数分配给匿名函数的参数 'a'。
对 f3 的赋值应该失败,因为无法将提供给 Func3 类型的参数赋值给匿名函数的参数 'a',所以我希望编译器会引发错误,但实际上并不会。
这会导致调用 f3 时发生意外的访问冲突。
我的问题是,这种行为是预期的还是打字稿的缺陷 design/implementation?
// assignment violates principle of contra-variance.
// expect a compiling error but there isn't.
这是一个常见问题并记录在案:https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Type%20Compatibility.md#function-argument-bivariance
基本上它可以方便地添加事件侦听器(这是一个相当常见的 JS 任务,如果语言将滑块进一步拉向安全,将很难移植到 TypeScript)
我是 typescript 的新手,我发现一些关于 covariance/contra-variance 类似行为的意想不到的事情。
这是一个代码片段:
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 是可以的,因为匿名函数的 return 值可以分配给 Func1 的 return 值类型。
分配给 f2 也可以,因为可以将输入 Func2 类型的参数分配给匿名函数的参数 'a'。
对 f3 的赋值应该失败,因为无法将提供给 Func3 类型的参数赋值给匿名函数的参数 'a',所以我希望编译器会引发错误,但实际上并不会。
这会导致调用 f3 时发生意外的访问冲突。
我的问题是,这种行为是预期的还是打字稿的缺陷 design/implementation?
// assignment violates principle of contra-variance. // expect a compiling error but there isn't.
这是一个常见问题并记录在案:https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Type%20Compatibility.md#function-argument-bivariance
基本上它可以方便地添加事件侦听器(这是一个相当常见的 JS 任务,如果语言将滑块进一步拉向安全,将很难移植到 TypeScript)