這是我的代碼:
interface Siswa {
name: string,
points: { a: number, b: number, c: number, d?: number, e?: number }
}
function find_average_points(data: Array<Siswa>): Array<{name: string, average: number}> {
let returned_array: Array<{name: string, average: number}> = [];
data.forEach((item: Siswa) => {
let sum: number = 0;
let keys = Object.keys(item.points);
keys.forEach((key: any) => sum =item.points[key]);
returned_array.push({name: item.name, average: (sum/keys.length)});
});
return returned_array;
}
當我在 JavaScript 中嘗試這個函式時,它運行正確,結果正是我想要的,但是在 TypeScript 中,我在item.points[key]. 它說:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; b: number; c: number; d?: number | undefined; e?: number | undefined; }'.
No index signature with a parameter of type 'string' was found on type '{ a: number; b: number; c: number; d?: number | undefined; e?: number | undefined; }'
我不知道這是什么意思。
uj5u.com熱心網友回復:
UsingObject.keys()回傳型別string[](如本評論中所述)。相反,您可以為points物件中的已知鍵創建陣列,使用它們來構建您的型別,然后在對值求和時回圈遍歷這些鍵:
TS 游樂場鏈接
const definitePoints = ['a', 'b', 'c'] as const;
const maybePoints = ['d', 'e'] as const;
type Points = (
Record<typeof definitePoints[number], number>
& Partial<Record<typeof maybePoints[number], number>>
);
interface Siswa {
name: string,
points: Points;
}
interface SiswaAverage {
name: string;
average: number;
}
function find_average_points (data: Array<Siswa>): Array<SiswaAverage> {
const result: Array<SiswaAverage> = [];
for (const {name, points} of data) {
let sum = 0;
let count = 0;
for (const point of [...definitePoints, ...maybePoints]) {
const value = points[point];
if (typeof value !== 'number') continue;
sum = value;
count = 1;
}
result.push({name, average: sum / count});
}
return result;
}
uj5u.com熱心網友回復:
可以結合使用keyof和null檢查來解決問題。
interface Points { a: number, b: number, c: number, d?: number, e?: number } // only did to use keyof
interface Siswa {
name: string,
points: Points
}
function find_average_points(data: Array<Siswa>): Array<{name: string, average: number}> {
let returned_array: Array<{name: string, average: number}> = [];
data.forEach((item: Siswa) => {
let sum: number = 0;
let keys = Object.keys(item.points) as (keyof Points)[]; // use this if you know you wont add extra non number properties in Point
keys.forEach((key) => sum =item.points[key] ?? 0); // for d and e with are optional
returned_array.push({name: item.name, average: (sum/keys.length)});
});
return returned_array;
}
let obj: Siswa = { name: 'Paris', points: { a: 2 , b:2, c: 4, d: 4 }} // can not add random stuff type safe
console.log(find_average_points([obj]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367668.html
