جافاسكريبت - تايب سكريبت: الخاصية غير موجودة على نوع '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