#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:
Решение таково
- установите npm i @types/googlemaps@3.43.3 «
- перейдите в 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
});