gpt4 book ai didi

typescript - 协方差/反方差中的意外行为,如 typescript 的分配

转载 作者:搜寻专家 更新时间:2023-10-30 21:53:42 24 4
gpt4 key购买 nike

我是 typescript 的新手,我发现一些关于协方差/反方差行为的意想不到的事情。

这是一个代码片段:

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 时出现意外的访问冲突。

我的问题是,这种行为是预期的还是 typescript 设计/实现的缺陷?

最佳答案

// 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 任务,如果语言将 slider 进一步拉向安全,将很难移植到 TypeScript)

关于typescript - 协方差/反方差中的意外行为,如 typescript 的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34735368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com