جافاسكريبت - تايب سكريبت: الخاصية غير موجودة على نوع 'object'
لدي الإعداد التالي وعندما أتصفح باستخدام for...of وأحصل على خطأ:
الخاصية "country" غير موجودة في النوع "object".
هل هذه طريقة صحيحة للتكرار عبر كل كائن في المصفوفة ومقارنة قيمة خاصية الكائن؟
let countryProviders: object[];
export function GetAllProviders() {
allProviders = [
{ region: "r 1", country: "US", locale: "en-us", company: "co 1" },
{ region: "r 2", country: "China", locale: "zh-cn", company: "co 2" },
{ region: "r 4", country: "Korea", locale: "ko-kr", company: "co 4" },
{ region: "r 5", country: "Japan", locale: "ja-jp", company: "co 5" }
]
for (let providers of allProviders) {
if (providers.country === "US") { // error here
countryProviders.push(providers);
}
}
}
الإجابة رقم 1
من المحتمل أن يكون لديك allProviders مكتوبًا أيضًا كـ object[]. و الخاصية country غير موجودة على object. إذا لم تكن تهتم بالأنواع، يمكنك الإعلان عن كل من allProviders و countryProviders كـ Array<any>:
let countryProviders: Array<any>;
let allProviders: Array<any>;
إذا كنت تريد التحقق من نوع البيانات الثابت. يمكنك إنشاء واجهة للبنية واستخدامها:
interface Provider {
region: string,
country: string,
locale: string,
company: string
}
let countryProviders: Array<Provider>;
let allProviders: Array<Provider>;
الإجابة رقم 2
إذا كان كائنك يحتوي على أي أزواج مفتاح/قيمة، يمكنك إعلان واجهة تسمى keyable مثل:
interface keyable {
[key: string]: any
}
ثم استخدمه كما يلي :
let countryProviders: keyable[];
أو
let countryProviders: Array<keyable>;
لحالتك الخاصة، حاول تحديد نوع المفتاح واستخدم أداة Record لتحديد الكائن:
type ProviderKey="region" | "country" | "locale" | "company"
let countryProviders: Array<Record<ProviderKey,string>>;
الإجابة #3
نعم، الطرق المذكورة أعلاه موصى بها بشدة، ولكن إذا لم يكن لديك خيار وتريد الاستمرار في استخدام "allProviders" كمصفوفة من الكائنات، فاذهب لهذه الطريقة. لقد نجحت معي دون إنشاء واجهة.
if(providers["country"] === "US") // replacement
