在类型脚本中对交集类型进行严格的类型检查会造成混淆

时间:2018-12-19 03:27:21

标签: typescript google-maps

这个问题最终与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;

这对我有用,但我不太喜欢。

1 个答案:

答案 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' }
}