我的任務是將 A 型別的陣列轉換為具有類 Person 物件的物件。我成功了,但我無法使用轉換后的陣列呼叫類 Person 的方法。這是我無法理解的,因為所有的 console.log 檢查都表明一切都轉換得很好,并且 b 包含類 Person 的實體,而不僅僅是帶有資料的陣列。
所以我的代碼在這里顯示:
import crypto from "crypto"
type A = Array<[string, number, string]>;
type B = {
[id: string]: Person
}
export class Person {
_id: string; // must be unique
age: number;
name: string;
city: string;
constructor(name: string, age: number, city: string) {
this._id = Person.generateUniqueID(12);
this.age = age
this.name = name
this.city = city
}
private static generateUniqueID(len: number): string {
return crypto.randomBytes(Math.ceil(len/2))
.toString('hex')
.slice(0, len);
}
public tellUsAboutYourself(): string {
console.log(
`Person with unique id = ${this._id} says:\n
Hello! My name is ${this.name}. I was born in ${this.city}, ${this.age} years ago.`
);
return `Person with unique id = ${this._id} says:\n Hello! My name is ${this.name}. I was born in ${this.city}, ${this.age} years ago.`
}
}
export const a: A = [
['name1', 24, 'city1'],
['name2', 33, 'city2'],
['name3', 61, 'city3'],
['name4', 60, 'city4']
];
export const b: B = a.reduce(function (value: any, [name, age, city]) {
let persona = new Person(name, age, city);
value[persona._id] = [persona.name, persona.age, persona.city]
return value;
}, {});
a 成功轉換為 b,b 的控制臺日志如下所示:
{
'd85750baf38f': [ 'name1', 24, 'city1' ],
'1f8fc00c6762': [ 'name2', 33, 'city2' ],
'8bac45ed719b': [ 'name3', 61, 'city3' ],
'1f00fa9086a2': [ 'name4', 60, 'city4' ]
}
Object.keys(b) 的控制臺日志是:
[ 'd85750baf38f', '1f8fc00c6762', '8bac45ed719b', '1f00fa9086a2' ]
那我怎么做:
Object.keys(b).forEach(key => {
b[key].tellUsAboutYourself();
})
在 tsc 編譯器中它說:
exports.b[key].tellUsAboutYourself();
^
TypeError: exports.b[key].tellUsAboutYourself is not a function
uj5u.com熱心網友回復:
您的b物件沒有任何Person(). 您只是粘貼非方法屬性。
正如您在下面看到的,中的任何屬性b都沒有物件實體,而只是一個陣列。
{
'd85750baf38f': [ 'name1', 24, 'city1' ],
'1f8fc00c6762': [ 'name2', 33, 'city2' ],
'8bac45ed719b': [ 'name3', 61, 'city3' ],
'1f00fa9086a2': [ 'name4', 60, 'city4' ]
}
當您執行以下操作時,的每個屬性都b將是一個Person實體并具有方法 -tellUsAboutYourself
export const b: B = a.reduce(function (value: any, [name, age, city]) {
let persona = new Person(name, age, city);
value[persona._id] = persona;
return value;
}, {});
可以使用撰寫最終回圈的更好方法Object.values(),因此您可以直接獲得各個值:
Object.values(b).forEach(obj => {
obj.tellUsAboutYourself();
})
但這只是一個改進。
uj5u.com熱心網友回復:
當你做
value[persona._id] = [persona.name, persona.age, persona.city]
在 de reduce 中,您沒有保存 Person 物件,您只是將其屬性放在一個陣列上。這個陣列不會有 Person 的方法。你應該做
value[persona._id] = persona
反而。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348108.html
標籤:javascript 数组 打字稿 for循环
下一篇:使用for回圈進行串列捆綁
