Mapbox-gl输入不允许accessToken分配

时间:2017-06-02 15:18:04

标签: typescript mapbox

我正在使用带有TypeScript的mapbox-gl库,并且我已使用@types/mapbox-gl安装了其社区来源类型定义。当我尝试导入并设置accessToken以使用该库时,我的TypeScript编译器会抛出此错误: TS2540: Cannot assign to 'accessToken' because it is a constant or a read-only property.

所以我提取了.d.ts文件,有问题的变量看起来非常易于分配(见https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/mapbox-gl/index.d.ts}):

declare namespace mapboxgl {
   let accessToken: string;
   ...

这是我的代码:

import * as mapbox from 'mapbox-gl';
mapbox.accessToken = 'token';

版本!

"@types/mapbox-gl": "^0.35.0",
"typescript": "^2.3.4",
"mapbox-gl": "^0.37.0",

TypeScript hackery说我可以将mapbox投射到任何一个并且它可以工作,但我很好奇这里输入错误是什么。

3 个答案:

答案 0 :(得分:26)

这是我一直在使用的临时解决方法:

Object.getOwnPropertyDescriptor(mapboxgl, "accessToken").set('YOUR_TOKEN');

解释

由于对象被重新定义为使用自定义setter将令牌放在内部闭包中 - 我们可以直接调用setter函数,如示例所示。

潜水更深一点,我们可以看到es6模块是定义的常量: https://github.com/Microsoft/TypeScript/issues/6751#issuecomment-177114001

然后,我们可以执行以下操作:(mapboxgl as any).accessToken = ..。这将有效。

答案 1 :(得分:5)

对于那些现在发现此问题的人……您甚至无需以这种方式设置Mapbox accessToken,就可以将其作为选项传递(自v1.2起)

const map = new mapboxgl.Map({
  accessToken: '...',
  container: '...',
  style: '...',
});

可惜,这不是在所有示例中使用的方法。

文档:https://docs.mapbox.com/mapbox-gl-js/api/#map

1.2发行说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v1.2.0

添加了它的PR:https://github.com/mapbox/mapbox-gl-js/pull/8364

答案 2 :(得分:1)

您也可以使用以下格式:

(mapboxgl as typeof mapboxgl).accessToken = ...