gpt4 book ai didi

typescript - TypeScript 中的混合类型和交集类型有什么区别?

转载 作者:行者123 更新时间:2023-12-02 00:53:58 29 4
gpt4 key购买 nike

查看 TypeScript 文档并试用 Intersection Types 的示例和 Mixins 在 TypeScript 中 使用提供的实用方法,我看到两种方法的行为和结果基本相同。我最终得到一个对象,它是 1..n 个其他 typesInterfacesClasses 的组合。以下是我在编码示例中使用的方法,它们直接来自 TypeScript 文档。

这用于在 TypeScript 中应用 mixins:

function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name));
});
});
}

这是我用于交叉口类型的:

function extend<First, Second>(first: First, second: Second): First & Second {
const result: Partial<First & Second> = {};
for (const prop in first) {
if (first.hasOwnProperty(prop)) {
(<First>result)[prop] = first[prop];
}
}
for (const prop in second) {
if (second.hasOwnProperty(prop)) {
(<Second>result)[prop] = second[prop];
}
}
return <First & Second>result;
}

除了 mixins 方法接受一个数组,而 intersection type 方法特别接受 2 个值之外,从行为的角度来看,它们最终的行为是相同的。如果我有一个 PersonUser 类,每个类都有单独的属性和方法,在使用上面的任何一种方法之后,我就可以从定义的类型中创建一个新实例intersection typemixin 并查看来自 PersonUser 的所有内容的组合。

具有讽刺意味的是,这正是我想要的,但我觉得我缺少何时使用其中任何一个的目的。我做了一些挖掘,发现这篇文章与 JavaScript 相关( What's the difference between mixin() and extend() in Javascript libraries ) 但我不确定在这种情况下 extend 是否与 TypeScript 中的 intersection type 相同(即使 helper 方法就是这样调用的)。

查看这两个辅助方法,它们似乎 完全按照需要从 A 到 B 复制或定义属性。有人可以解释一下 TypeScript 中这两种方法之间的区别,以及为什么要使用一种方法而不是另一种方法吗?

最佳答案

我会尽力付出我的两分钱。

Mixins 旨在改变类定义,添加其他对象提供的功能。他们在原型(prototype)上工作,因此效果是针对所有实例执行的,包括已经制作的 future 的实例。

交叉点 旨在扩展一个给定实例 的属性而不改变原始实例。实际上,返回的对象是一个全新的实例

const result: Partial<First & Second> = {};

所以我认为差异很大。在不处理原型(prototype)的情况下,给出的只是一个单一的、一次性的实例。同一类的实例不会受到更改的影响,因为类原型(prototype)中没有反射(reflect)任何实例。

关于typescript - TypeScript 中的混合类型和交集类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55644596/

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