【问题标题】:TypeScript function generic types intersection does not behave correctlyTypeScript 函数泛型类型交集行为不正确
【发布时间】:2017-02-27 00:15:04
【问题描述】:
interface A {
  a: number;
}

let myVar: A = {
  a: 123
};

myVar = Object.assign({}, myVar, {
  b: 456
});

为什么 TypeScript 不抱怨通过 Object.assign() 调用重新分配 myVar

鉴于Object.assign() 调用的类型定义为:

assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;

...而且我调用中三种类型的(返回类型)交集与interface A 不匹配,编译器不应该选择它吗?

问题与 TypeScript 无法推断函数调用中的类型无关,因为如果我将代码更改为:

interface A {
  a: number;
}

interface B {
  b: number;
}

interface C {}

let myVar: A = {
  a: 345
};

myVar = Object.assign<C, A, B>({}, myVar, {
  b: 345
});

...它仍然没有抱怨。

我使用的是 TypeScript 2.2.1,并且“noImplicitAny”编译器标志设置为“true”。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 结构类型系统的基本规则是,如果 y 至少有与 x 相同的成员,则 x 与 y 兼容

    将此规则应用于您的示例 - AA&amp;B&amp;C 兼容:

    let abc:A&B&C = {a:123, b:456};
    

    分配let a:A = abc; 完全有效。

    更多信息here

    【讨论】:

    • 我觉得这个答案令人困惑,尽管它确实让我想到了真正的原因。我觉得我的回答更简洁准确。
    • 我引用了官方打字稿documentation的引述。究竟是什么令人困惑?
    • 您链接的文档页面上下文中的那句话确实有道理,但在这个问题的上下文中却令人困惑和误导。我为反对票道歉,我试图摆脱它,因为你确实帮助我找到了答案,但它不会让我。
    【解决方案2】:

    如果A 可分配给XB 可分配给X,则A &amp; B 可分配给X

    鉴于 TypeScript 使用了structural type system,之所以没有错误是因为myVar 的重新分配从源/原始myVar(第二个参数)获取属性并从此满足。因此,在满足myVar 的类型时,任何其他混入的对象(例如第一个和第三个参数)都无关紧要。

    Quote source

    【讨论】:

    • 您的示例中没有 X。 myVar 被定义为A,所以它肯定可以存储A&amp;B 类型的值
    • 我知道在我的示例中没有X,我试图将引用中的X 与我的示例中的等价物(myVar) 联系起来。
    • X 在您的示例中是 A,因此 => 如果 A 可分配给 A 或 B 可分配给 A,则 A 和 B 可分配给 A
    • 你失去了我,我认为你错了。我很确定X 指的是一个变量,而不是那个上下文中的类型。
    • 您的答案中的错误点是您将myVar(variable) 与X(type) 相关联。
    猜你喜欢
    • 2021-07-01
    • 2021-10-18
    • 2018-07-03
    • 2020-07-25
    • 2020-07-31
    • 2020-11-15
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多