TypeScript中<P = any>的含义及Leaflet Marker泛型语法疑问
关于Leaflet中
Marker<P = any>的语法解释 这是TypeScript里的泛型类型参数默认值,和你误以为的P: any完全不是一回事,我来给你拆解明白:
首先,
Marker<P = any>的本质:
这是给泛型类Marker的类型参数P设置了默认类型any。意思是当你实例化Marker的时候,如果不主动指定P的具体类型,TypeScript会自动把P当成any来处理,不用你手动写Marker<any>。为什么不能写成
P: any?
这是TypeScript的语法规则问题::是用来给变量、函数参数指定类型的,而泛型参数的声明里,=才是用来设置默认类型的语法。如果你写Marker<P: any>,TypeScript直接会报语法错误,因为泛型参数的声明格式是<泛型参数名 = 默认类型>,不是用:。结合Leaflet的代码看实际作用
你看Marker类里的toGeoJSON()方法,它的返回值是geojson.Feature<geojson.Point, P>——这里的P就是用来定义GeoJSON Feature对象里properties字段的类型。举个实际的例子:// 定义你自己的标记属性类型 type CustomMarkerProps = { markerId: number; title: string; description: string; }; // 实例化时指定P为CustomMarkerProps const myMarker = new Marker<CustomMarkerProps>([39.9042, 116.4074]); // 此时toGeoJSON返回的Feature的properties会有完整的类型提示 const markerGeoJson = myMarker.toGeoJSON(); // markerGeoJson.properties.markerId 会被TS识别为number类型,能获得类型检查和补全如果你不指定
P,就会默认用any,这时候markerGeoJson.properties就是any类型,失去了TypeScript的类型校验优势。总结
这个语法是TypeScript泛型的实用特性,目的是让泛型类既支持开发者自定义类型(获得类型安全),又在不需要自定义类型的时候提供默认值(简化使用),算是灵活性和易用性的平衡设计。
内容的提问来源于stack exchange,提问作者Runtime Terror
相关产品推荐
相关产品推荐

