我不確定你應該如何在 TypeScript 中嵌套函式。我的做法類似于 Javascript,但出現了很多錯誤。
我的打字稿檔案中有這個(這基本上是那里唯一的東西):
ngAfterViewInit(): void {
d3.csv('data/data.csv').then((data: Array<String> => {
data.forEach(d:string =>{
d.age = Number(d.age)
})
})
}
我的 data.csv 檔案有這個:
name,age
Lam,30
Peter,90
Aaron,2
Swizt,14
Irene,36
Travis, 55
我收到錯誤,例如
"Argument of type '(data: String[], { data, forEach }: any) => any' is not assignable to parameter of type '(value: DSVRowArray<string>) => any'.ts(2345)"
, 和
"A parameter initializer is only allowed in a function or constructor implementation.ts(2371)"
uj5u.com熱心網友回復:
編譯器告訴您您為回呼函式提供了錯誤的型別。d3.csv回傳 aDSVRowArray<string>不是 a String[]。您還忘記了關閉括號,.then((data: Array<String>因此為什么{ data, forEach }: any會出現在引數串列中。string也是foreach回圈的錯誤型別,它應該是DSVRowString.
此外,編譯器將阻止您將數字值分配給 a 的屬性DSVRowString,因為 d3 開發人員已指定僅允許字串屬性。因此,如果您想要一個具有數值的物件,您應該創建一個新物件。
您可以在回呼中定義DSVRowArray<string>和DSVRowString型別,但這不是必需的。編譯器已經根據 d3 開發人員提供的型別定義知道型別。所以你可以排除它們,intellisense 和 tsc 會推斷出正確的型別。
ngAfterViewInit(): void {
d3.csv('data/data.csv').then((data) => {
data.forEach((d) => {
const convertedData = { age: Number(d['age']) };
});
});
}
如果您絕對需要保持相同的結構,則只需將型別轉換DSVRowString為any. 這只是讓編譯器不理你的一種方法。不過不推薦。
ngAfterViewInit(): void {
d3.csv('data/data.csv').then((data) => {
data.forEach((d: any) => {
d.age = Number(d.age);
});
});
}
csv 函式還有一個多載,您可以在其中提供一個描述如何決議每一行的函式。在下面的函式中,我在將滑鼠懸停在變數上后從智能感知中獲得data了型別。d3.DSVParsedArray<{age: number}>
ngAfterViewInit() {
d3.csv('data/data.csv', (d) => {
return { age: Number(d['age']) };
}).then((data) => console.log(data));
}
記錄資料給了我:
Array(6) [ {…}, {…}, {…}, {…}, {…}, {…} ]
0: Object { age: 30 }
1: Object { age: 90 }
2: Object { age: 2 }
3: Object { age: 14 }
4: Object { age: 36 }
5: Object { age: 55 }
columns: Array [ "name", "age" ]
length: 6
<prototype>: Array []
這似乎只是Array附加columns屬性的擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447356.html
標籤:javascript 有角度的 打字稿 d3.js
