由于类型'string'和'()=> string'没有重叠,因此此条件将始终返回'false'

时间:2019-02-09 17:45:55

标签: angular

我有一个JSON文件,其中包含以下对象数组:https://pastebin.com/raw/prnChamA。数据包含称为postitoimipaikka的键,我需要循环访问这些键,以便仅获得键postitoimipaikka中具有匹配值的那些对象。

用户输入字符串postitoimipaikka作为函数参数,然后将其用于遍历对象的JSON数组。

我在atms.service.ts中遇到以下错误:This condition will always return 'false' since the types 'string' and '() => string' have no overlap

在线:

if (d.postitoimipaikka == postitoimipaikka.toUpperCase) {

atms.service.ts:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { atm } from '../app/atm.interface';

@Injectable()
export class ATMService {

  constructor(public http: HttpClient) { }

  url = "./assets/data.json";

  searchByMunicipalityName = (municipality: string): Promise<atm[]> => {
    return new Promise((resolve, reject) => {
      this.http.get(this.url).subscribe((data: atm[]) => {
        let list: atm[] = [];
        for (let d of data) {
          if (d.postitoimipaikka == municipality.toUpperCase) {
            lista.push(d);
          }
        }
        resolve(list);
      }, (error) => {
        reject(error);
      })
    })
  }


}

如果删除了toUpperCase方法,则用户必须以大写形式键入该字符串,但该字符串不能正常工作。

2 个答案:

答案 0 :(得分:2)

您的错误是您未调用toUpperCase,因此必须在其后加上括号。另外,您定义了一个名为list的数组,但实际上是在推入一个名为lista的数组。

您可以将代码重构为此:

return new Promise((resolve, reject) => {
    this.http.get(this.url).subscribe((data: atm[]) => {
        resolve(data.filter(d => d.postitoimipaikka == municipality.toUpperCase()));
      }, (error) => {
        reject(error);
      })
    })
  }

答案 1 :(得分:1)

我更喜欢使用filter()从数组中提取对象。我的版本如下:

searchByMunicipalityName = (municipality: string): Promise<atm[]> => {
    return new Promise((resolve, reject) => {
      this.http.get(this.url).subscribe((data: atm[]) => {
        const list: atm[] = data.filter(x => 
        x.postitoimipaikka === municipality.toUpperCase()); 
        resolve(list);
      }, (error) => {
        reject(error);
      })
    })
  }