I'm using the mapbox-gl library with TypeScript, and I've installed its community sourced type definitions with @types/mapbox-gl. When I try to import and set an accessToken to use the library, my TypeScript compiler throws this error:
TS2540: Cannot assign to 'accessToken' because it is a constant or a read-only property.
So I pulled up the .d.ts file and the variable in question looks extremely assignable (seen here: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/mapbox-gl/index.d.ts):
declare namespace mapboxgl {
let accessToken: string;
...
This is my code:
import * as mapbox from 'mapbox-gl';
mapbox.accessToken = 'token';
Versions!
"@types/mapbox-gl": "^0.35.0",
"typescript": "^2.3.4",
"mapbox-gl": "^0.37.0",
TypeScript hackery says that I can cast mapbox to any and it will work, but I'm very curious what about the typing is going wrong here.
Here's a temporary workaround I've been using:
Object.getOwnPropertyDescriptor(mapboxgl, "accessToken").set('YOUR_TOKEN');
Explanation
Since the object was redefined to use a custom setter which places the token inside an internal closure - we can call the setter function directly as shown in the example.
Diving a little deeper, we can see that es6 modules are constants by definition: https://github.com/Microsoft/TypeScript/issues/6751#issuecomment-177114001
we can then do something like: (mapboxgl as any).accessToken = ... which will work.
You can also use this format:
(mapboxgl as typeof mapboxgl).accessToken = ...
来源:https://stackoverflow.com/questions/44332290/mapbox-gl-typing-wont-allow-accesstoken-assignment