查看TypeScript文档,并使用提供的实用程序方法在TypeScript中尝试Intersection Types和Mixins 的示例,我发现两者的行为和结果基本相同方法论。我最后得到的对象最终是1..n个其他types
,Interfaces
或Classes
的组合。这是我在编码示例中使用的方法,这些方法在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));
});
});
}
这是我用于intersection type
的内容:
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
方法专门采用两个值这一事实之外,从行为的角度来看,它们最终的行为相同。如果我有一个Person
和User
类,分别具有各自的属性和方法,则在使用上述任何一种方法之后,我都可以根据intersection type
定义的类型创建新实例或mixin
,然后查看Person
和User
的所有组合。
具有讽刺意味的是,这正是我想要的,但是我觉得我错过了何时使用这两种方法的目的。我做了一些挖掘,发现这篇文章与JavaScript(
What's the difference between mixin() and extend() in Javascript libraries),但是我不确定extend
在这种情况下是否与TypeScript中的intersection type
相同(即使helper方法只是这样)。
查看它们出现的两种辅助方法,以完全按照需要将A的属性复制或定义为B。有人可以解释一下TypeScript中的两种方法之间的区别,以及为什么要使用一种方法替代另一种方法吗?
答案 0 :(得分:1)
我会尽力给我两美分。
Mixins 旨在更改类定义,增加其他对象提供的功能。它们可以处理原型,因此可以对所有已经和将来的实例执行效果。
交叉点旨在扩展一个给定实例的属性,而无需更改原始实例。实际上,返回的对象是一个全新的实例
const result: Partial<First & Second> = {};
所以我认为差异很大。如果不使用原型,给出的只是一个一次性实例。同一类的实例将不受更改的影响,因为这些都不会反映在类原型中。