Typescript: как мне использовать класс или интерфейс из пространства имен

#javascript #typescript

#javascript #машинописный текст

Вопрос:

Я хочу расширить класс, определенный в пространстве google.maps имен в этом файле:

@types/googlemaps/index.d.ts

 class MyMarker extends google.maps.Marker {
  constructor(options: google.maps.MarkerOptions){
    super(options);
  }
}
 

Это происходит без ошибок. Но во время выполнения я получаю сообщение об ошибке в конструкторе, потому google.maps что глобальный все еще не определен.

Что я делаю не так?

Комментарии:

1. вы уверены, что добавили модуль Google map?

Ответ №1:

Сначала вам нужно импортировать его, например

 import Marker from 'googlemaps';

class MyMarker extends Marker 
 

Комментарии:

1. Я пробовал это, но TS выдает мне ошибку, .../@types/googlemaps/index.d.ts is not a module . Это пространство имен, и фактическая библиотека googlemaps загружается динамически

Ответ №2:

Кстати, мой запасной вариант — использовать interface вместо class и выполнить кучу типовых упражнений TS. Это работает, но не оптимально…

 // new google.maps.Marker for MarkerClusterer
export interface UuidMarker extends Marker {
  uuid: string;
}

/**
 * Hack: "extend" google.maps.Marker to include uuid property
 *  guard with this.ready.then() to ensure google.maps is loaded
 */
function UuidMarkerFactory(uuid: string, options?: MarkerOptions) : Promise<UuidMarker> {
  return this.ready.then( ()=>{
    let gmOptions = options as any as google.maps.MarkerOptions;
    const marker = new google.maps.Marker( gmOptions );
    marker['uuid'] = uuid;
    return marker as any as UuidMarker;
  })
}