Не удается найти имя ‘google’ angular 8

#angular #typescript #angular8 #googleplacesautocomplete #agm-core

#angular #typescript #angular8 #google-места-автозаполнение #agm-ядро

Вопрос:

Поскольку он показывает ошибку во время сборки.

ОШИБКА в app /pages /TestPage4 /TestPage4.ts:27:27 — ошибка TS2304: не удается найти имя ‘google’.

27 this.geoCoder = новый google.maps.Геокодер; ~~~~~~ app /pages/TestPage4/TestPage4.ts:29:32 — ошибка TS2304: не удается найти имя ‘google’.

29 постоянное автозаполнение = новый google.maps.places.Автозаполнение (this.searchElementRef.nativeElement); ~~~~~~ app/pages/TestPage4/TestPage4.ts:33:24 — ошибка TS2503: не удается найти пространство имен ‘google’.

33 постоянное место: google.maps.places.PlaceResult = автозаполнение.getPlace(); ~~~~~~

Вот мой код ниже.

 import { Component, OnInit, ElementRef, ViewChild, NgZone } from '@angular/core';
import { MapsAPILoader } from '@agm/core';

@Component({
  selector: 'app',
  templateUrl: './TestPage4.html',
  styleUrls: ['./TestPage4.css']
})

export class TestPage4 implements OnInit {
  lat: number;
  lng: number;
  zoom = 1;
  private geoCoder;

  @ViewChild('search', { static: false})
  public searchElementRef: ElementRef;

  constructor(
    private mapsAPILoader: MapsAPILoader,
    private ngZone: NgZone) {}

  ngOnInit() {
    //load Places Autocomplete
    
    this.mapsAPILoader.load().then(() => { 
      this.geoCoder = new google.maps.Geocoder;

      const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement);
      autocomplete.addListener("place_changed", () => {
        this.ngZone.run(() => {
          //get the place result
          const place: google.maps.places.PlaceResult = autocomplete.getPlace();
          console.log(place);
          //verify result
          if (place.geometry === undefined || place.geometry === null) {
            return;
          }

          for (var i = 0; i < place.address_components.length; i  ) {
            let addressType = place.address_components[i].types[0];
            //if (componentForm[addressType]) {
            //  var val = place.address_components[i][componentForm[addressType]];
            //  document.getElementById(addressType).value = val;
            //}
            // for the country, get the country code (the "short name") also
            console.log(addressType);
            if (addressType == "country") {
              console.log(place.address_components[i].short_name);
              console.log(place.address_components[i].long_name);
            }
            else{
              console.log('---others---');
              console.log(place.address_components[i].short_name);
              console.log(place.address_components[i].long_name);
            }
          }

          //set latitude, longitude and zoom
          this.lat = place.geometry.location.lat();
          this.lng = place.geometry.location.lng();
          this.zoom = 12;
        }); 
      });
    });
  }
}
  

Как я нажимаю на это new google.maps.Geocoder и показывает мне, что оно существует здесь, ниже.
введите описание изображения здесь
Но на самом деле при сборке отображается вышеуказанная ошибка.

Обновление 1:

 {
  "compileOnSave": false,
  "compilerOptions": {
    "downlevelIteration": true,
    "importHelpers": true,
    "module": "esnext",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ],
    "baseUrl": "src",
    "paths": { "@angular/*": ["node_modules/@angular/*"] }
  }
}
  

Это файл tsconfig.json.

Обновление 2:
Использование declare var google: any; работает на
this.geoCoder = new google.maps.Geocoder; и
const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement); но сбой в Google.maps.places.PlaceResult Не удается найти пространство имен ‘google’ const place: google.maps.places.PlaceResult = autocomplete.getPlace();

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

1. Можете ли вы показать свой ts.config? Проблемы могут заключаться в том, что angular ts.config по умолчанию имеет типы: [] (пустой массив). В этом случае вам нужно добавить ‘googlemaps’ к типам.

2. @SherifElmetainy я думаю, что его файл tsconfig.json, который я обновил выше для справки.

3. На вашем скриншоте это не класс google.maps, это просто типы для него. И ваша ошибка говорит о том, что вы не импортировали карты Google в свой компонент

4. Я уже объяснял, если вы не импортировали в мой компонент, то почему он перенаправляется, когда я использую F12 для index.d.ts .. ?

5. @vitaliykotov это также должно показывать ошибку на странице машинописи .. ?

Ответ №1:

Нашел решение в tsconfig.app.json.

 {
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "types": ["googlemaps"]
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}
  

Добавлено только "googlemaps" в типах, которые отсутствовали, и ошибка исчезла. Нет необходимости добавлять declare var google: any; будет отлично работать без него.

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

1. Для пакета npm @angular/google-maps используйте: «типы»: [«google.maps»]

2. Также … в вашем app.module.ts у меня был неполный импорт, и мне нужно было добавить к нему «библиотеки: [‘places’]»: AgmCoreModule.forRoot({ // developers.google.com/maps/documentation/javascript /… apiKey: ‘….’, библиотеки: [‘места’]

Ответ №2:

Решение таково

  1. установите npm i @types/googlemaps@3.43.3 «
  2. перейдите в tsconfig.app.json и установите тип в «типы»: [«googlemaps»]

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

1. В какой версии Angular вы находитесь? Я нахожусь на версии 14, когда npm i @types/googlemaps мне сказали, что она устарела и автоматически переключается на @types/google.maps , и то же самое не может найти имя «Google» . Попробовал запрошенное вами решение @types/googlemaps@3.43.3 , все то же самое.

Ответ №3:

Следующее сработало для моего варианта использования, используя узел 16:

 % node --version
v16.17.1
% npm --version
8.15.0
  

Установлен модуль Angular Google Maps и типы:

 npm i @angular/google-maps --legacy-peer-deps
npm i @types/googlemaps --legacy-peer-deps
  

Обратите внимание, что если вы используете более свежую версию Node, вы, вероятно, можете не использовать --legacy-peer-deps аргумент.

Затем добавьте тип карты Google в "types" директиву в tsconfig.app.json :

 {
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": [
      "google.maps" /* DECLARE TYPE HERE */
    ]
  },
  "files": [
    "src/main.ts",
    "src/polyfills.ts"
  ],
  "include": [
    "src/**/*.d.ts"
  ]
}
  

Наконец-то удалось использовать класс Google Maps:

 new google.maps.Map(this.mapElement.nativeElement, {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8
});