T & U
和类型交集在做什么有关。它使用T
还是U
的构造函数?还是两者都不是?是类还是接口?我是否仍可以使用构造函数创建新的T & U
对象? instanceOf可以工作吗?如果T & U
具有不同的属性(每个属性都是必需的),如何创建新的T & U
对象?以下是我问所有这些的原因,非常感谢。
我有一个google.maps.Marker。我想通过严格的类型检查为其添加一个id
属性。我认为最好的方法是扩展课程。但是问题在于扩展类时未加载google.maps.Marker,从而导致错误。参见线程here。
所以,我做了推荐的事情:
type IdMarker = google.maps.Marker & { id: string };
这很好。因此,我首先尝试用标记创建一个新的idMarker,但是由于标记没有id属性,因此无法编译。我尝试在使用传播算子分配标记时添加ID,但这没有用。因此,在上述定义中,我将id
设置为可选的id?
,可以分配我的idMarker: IdMarker = marker
然后添加id
属性。
但是,我希望提供ID。所以现在我有了这个:
const tempMarker: any = new google.maps.Marker(options);
tempMarker.id = markerData.id;
const marker: IdMarker = tempMarker;
marker.id = markerData.id;
这对我有用,但我不太喜欢。
答案 0 :(得分:1)
这对我有用,但我不太喜欢。
创建实用程序,例如
export class Marker {
constructor(public options: number) { }
}
export type IdMarker = Marker & { id: string };
export function createIdMarker(options: number, id: string) {
const marker = new Marker(options) as IdMarker;
marker.id = id;
return marker;
}
您可能已经听说过if a tree falls in the forest does it make a sound
。有一种类似的编程说法,if a function does mutation internally but pure in terms of all its arguments and return value, is it pure?
。
纯编程语言通常带有纯数据结构库,这些库在内部进行突变以提高性能。
由于您正在使用 instances ,因此无法传播(...
),但是如果它是仅包含json有效文字的对象,则可以使用它,例如
type Marker = { something: number }
type IdMarker = Marker & { id: string }
const idMarker: IdMarker = {
...{ something: 123 },
...{ id: 'foo' }
}