我正在構建一個 react-native / typescript 專案,我遇到了這個問題:
我有一個從 API 獲取的物件串列,它看起來像這樣:
[{ qwe1: 'Bob', qwe2: 18 },
{ qwe1: 'James', qwe2: 19 }]
但是我不想為這個物件(qwe1,qwe2)設定這些鍵名,我也不想運行 throw 所有物件并更改所有鍵。
所以我想制作一個物件來保存原始物件的所有鍵,但可以很好地訪問它們以獲得更好的名稱,它看起來像這樣:
{
name: 'qwe1',
age: 'qwe2'
}
然后當我想訪問用戶名時,例如我會這樣做:
myObject[objectKeyNames.name]
我還為物件創建了一個型別,如下所示:
{qwe1: string; qwe2: number;}
但是后來出現了一個錯誤,說:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '<the name of the type>'
我對打字稿真的很陌生,我真的不明白這一點,我將非常感謝您的支持。
提前致謝 :)
uj5u.com熱心網友回復:
定義您的objectKeyNames物件以專門參考資料物件中的鍵。
例如
interface ApiResult {
qwe1: string;
qwe2: number;
}
const objectKeyNames: {[key: string]: keyof ApiResult} = {
name: "qwe1",
age: "qwe2"
};
// ---
const myObject: ApiResult = {
qwe1: "Bob",
qwe2: 18
};
console.log(myObject[objectKeyNames.name]);
現在 Typescript 知道任何輸入的鍵objectKeyNames都會從 API 結果中參考一個有效的屬性名稱。
順便說一句,將一種資料格式重新映射到另一種資料格式通常很簡單
const niceObjects = results.map(({ qwe1, qwe2 }) => ({
name: qwe1,
age: qwe2,
}));
uj5u.com熱心網友回復:
與 JavaScript 相比,TypeScript 的全部意義在于型別安全。在普通的 JavaScript 中,person.lastMane會默默地給你undefined;TypeScript 編譯器會給你一個編譯時警告,人們沒有最后的鬃毛。但是,當你這樣做時person[attribute], where attributeis a string 其值在編譯時無法知道,TypeScript 必須洗掉它。它不知道是否attribute會是"lastName",或者最終會是"lastMane"。所以它說“我不知道這個,這取決于你。”
為了滿足 TypeScript,您可以做的一件事是查找訪問器而不是查找屬性名稱,這樣您就不需要通過字串動態查找屬性。像這樣的東西:
interface APIPerson {
qwe1: string;
qwe2: number;
}
const personAccessors = {
"name": (apiPerson: APIPerson) => apiPerson.qwe1,
"age": (apiPerson: APIPerson) => apiPerson.qwe2,
};
const apiPerson: APIPerson = {
qwe1: "John",
qwe2: 25,
}
const personName = personAccessors.name(apiPerson);
console.log(personName);
編輯:...但菲爾的解決方案更聰明:) 我留下這個主要是因為解釋了你為什么會收到錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/513977.html
上一篇:如何將陣列轉換為物件陣列中的物件
