如何修复“类型'字符串'是不可分配到类型'投影' mapbox-gl”错误在vs代码使用typescript

gt0wga4j  于 2023-05-30  发布在  TypeScript
关注(0)|答案(3)|浏览(194)

我正在尝试使用typescript设置mapbox-gl。当我尝试根据文档设置投影值时,在VS代码中出现以下错误。基本上:

map = new mapboxgl.Map({
      container: 'mapbox',
      style: 'mapbox://styles/mapbox/outdoors-v12',
      projection: 'naturalEarth'
    })

甚至建议的默认值是'mercator',这显然是一个字符串。当运行代码时,一切都正常工作,但是我如何告诉vs代码接受字符串在那里是正确的呢?
npm list的输出是这样的:

mapbox-gl@2.15.0

此外,这也被vs代码所接受:

map.setProjection('globe')

这与其他解决方案一样好,我仍然更喜欢一个答案,为什么我的原始代码被vs代码标记为错误,特别是考虑到它是从文档中逐字复制的,并且在实际运行代码时工作正常。

mrzz3bfm

mrzz3bfm1#

我很确定这是因为mapbox-gl的DefinitelyTyped包不是那么“最新”。您正在使用mapbox-gl@2.15.0,但在撰写本文时。mapbox-gl并没有发布自己的类型,但是这些类型可以从the DefinitelyTyped project获得,我假设你是从the DefinitelyTyped project获取类型的。每当你从那里抓取类型时,理想情况下,你会抓取类型包,该类型包具有匹配的主版本号和次版本号,用于它为其提供类型的包的版本(请参阅绝对类型的包版本如何与相应库的版本相关?例如,理想情况下,现在你会做npm i -D '@types/mapbox-gl@~2.15'。不幸的是,在撰写本文时,@types/mapbox-gl的最新版本是2.7.11。现在,当您查看mapbox-gl的更新日志时,您将看到您正在使用的特性是在v2.9.0中添加的。这就是为什么你没有得到类型。免费向DefinitelyTyped项目提交PR,为mapbox-gl的v2.9添加类型。

ijnw1ujt

ijnw1ujt2#

投影的类型应为ProjectionSpecification对象,而不是字符串。
请参考代码片段和this article

const map = new mapboxgl.Map({
    style: {
        version: 8,
        name: 'My Projected Style',
        sources: {
            // ...
        },
        layers: [
            // ...
        ],
        projection: {
            name: 'equalEarth'
        }
    }
});
flvlnr44

flvlnr443#

我就是这么做的
未知的投影

const mapContainer = useRef(null);
  const mapRef = useRef(null);
  const [lng, setLng] = useState(30);
  const [lat, setLat] = useState(50);
  const [zoom, setZoom] = useState(1.5);
  const [projection, setProjection] = useState("globe");

  useEffect(() => {
    if (mapRef.current) return; // initialize map only once
    const map: any = new mapboxgl.Map({
      container: mapContainer.current!,
      style: "mapbox://styles/mapbox/satellite-streets-v11",
      center: [lng, lat],
      zoom: zoom,
      projection: projection as unknown as Projection,
    });
    mapRef.current = map;
    map.on("load", function () {
      const setFog = () =>
        map.setFog({
          // range: [-1, 2],
          // "horizon-blend": 0.3,
          color: "gray",
          // "high-color": "#add8e6",
          // "space-color": "black",
          // "star-intensity": 10.0,
        });
      setFog();
    });

相关问题