Angular - 服务组件
Angular - Service Component
元素隐式具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型“{}”。
在类型“{}”.ts(7053)
上找不到参数类型为 'string' 的索引签名
收到以上错误信息。在这方面需要帮助。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { GlobalDataSummary } from '../models/gloabl-data';
@Injectable({
providedIn: 'root'
})
export class DataServiceService {
private globalDataUrl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-01-2021.csv'
constructor(private http : HttpClient) { }
getGlobalData(){
return this.http.get(this.globalDataUrl, {responseType :'text'}).pipe(
map(result=>{
let data: GlobalDataSummary[] = [];
let raw = {}
let rows = result.split('\n');
rows.splice(0 , 1);
//console.log(rows);
rows.forEach(row=>{
let cols = row.split(/,(?=\S)/)
let cs = {
country : cols[3],
confirmed : +cols[7],
deaths : +cols[8],
recovered : +cols[9],
active : +cols[10],
};
let temp = raw[cs.country];
if(temp)
{
temp.active = cs.active + temp.active
temp.confirmed = cs.confirmed + temp.confirmed
temp.deaths = cs.deaths + temp.deaths
temp.recovered = cs.recovered + temp.recovered
raw[cs.country] = temp;
}else{
raw[cs.country] = cs;
}
})
return Object.values(raw);
})
)
}
}
您收到此错误是因为您将值动态分配给未明确标记类型的原始数据。这可以通过使用任何类型显式标记 raw 来解决。变化
let raw = {}
到
let raw:any = {}
这将是一个快速修复。使用正确打字的更好修复。像这样为原始对象创建类型
interface Raw {
[key: string]: CS;
}
这里我们正在为对象创建一个类型,该对象将具有字符串键,值将是 CS 类型。 CS 是您要分配给原始文件的内容。您可以根据自己的选择命名它。以下是 CS 的类型。
interface CS {
country: string;
confirmed : number,
deaths : number,
recovered : number,
active : number,
}
像这样分配类型:
let raw: Raw = {};
// 这不会失败。这只是一个应该有效的示例。
raw['India'] = {
country: 'India',
confirmed : 22,
deaths : 0,
recovered : 22,
active : 0,
}
元素隐式具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型“{}”。 在类型“{}”.ts(7053)
上找不到参数类型为 'string' 的索引签名收到以上错误信息。在这方面需要帮助。
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { GlobalDataSummary } from '../models/gloabl-data';
@Injectable({
providedIn: 'root'
})
export class DataServiceService {
private globalDataUrl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/01-01-2021.csv'
constructor(private http : HttpClient) { }
getGlobalData(){
return this.http.get(this.globalDataUrl, {responseType :'text'}).pipe(
map(result=>{
let data: GlobalDataSummary[] = [];
let raw = {}
let rows = result.split('\n');
rows.splice(0 , 1);
//console.log(rows);
rows.forEach(row=>{
let cols = row.split(/,(?=\S)/)
let cs = {
country : cols[3],
confirmed : +cols[7],
deaths : +cols[8],
recovered : +cols[9],
active : +cols[10],
};
let temp = raw[cs.country];
if(temp)
{
temp.active = cs.active + temp.active
temp.confirmed = cs.confirmed + temp.confirmed
temp.deaths = cs.deaths + temp.deaths
temp.recovered = cs.recovered + temp.recovered
raw[cs.country] = temp;
}else{
raw[cs.country] = cs;
}
})
return Object.values(raw);
})
)
}
}
您收到此错误是因为您将值动态分配给未明确标记类型的原始数据。这可以通过使用任何类型显式标记 raw 来解决。变化
let raw = {}
到
let raw:any = {}
这将是一个快速修复。使用正确打字的更好修复。像这样为原始对象创建类型
interface Raw {
[key: string]: CS;
}
这里我们正在为对象创建一个类型,该对象将具有字符串键,值将是 CS 类型。 CS 是您要分配给原始文件的内容。您可以根据自己的选择命名它。以下是 CS 的类型。
interface CS {
country: string;
confirmed : number,
deaths : number,
recovered : number,
active : number,
}
像这样分配类型:
let raw: Raw = {};
// 这不会失败。这只是一个应该有效的示例。
raw['India'] = {
country: 'India',
confirmed : 22,
deaths : 0,
recovered : 22,
active : 0,
}