Typescript: يفقد مدقق النوع الكتابة في مقابل

تم إنشاؤها على ٨ نوفمبر ٢٠١٦  ·  3تعليقات  ·  مصدر: microsoft/TypeScript

إصدار TypeScript: 2.0.8

شفرة

// test.ts
interface Type {
  type: number;
}

interface TypeExt extends Type {
  arr: Type[];
}

const guard = (arg: Type): arg is TypeExt => arg.type === 1;
const otherFunc = (arg1: Type, arg2: TypeExt): void => {};

export function y(arg: Type): void {
  if (guard(arg)) {
    for (const ITEM/* error is here */ of arg.arr) {
      if (otherFunc(ITEM, arg)) {
      }
    }
  }
}

تجميع مع cmd: tsc --noImplicitAny test.ts

سلوك متوقع:
لا اخطاء

السلوك الفعلي:

test.ts(14,16): error TS7022: 'ITEM' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
Bug Fixed

التعليق الأكثر فائدة

هذه مسألة تحليل تدفق التحكم. لاستنتاج نوع ITEM نحتاج إلى معرفة نوع تدفق التحكم وهو arg.arr . وهذا بدوره يعني أننا بحاجة إلى النظر في التركيبات التي تؤثر على نوع arg . يتضمن هذا استدعاء otherFunc الذي يبدو أنه _ يمكن_ أن يكون مسند نوع محدد من قبل المستخدم. من أجل تحديد ما إذا كانت _is_ مسند نوع ، نقوم بحل تعبير الاستدعاء ، الذي يستلزم حل تعبيرات الوسيطات ، الأمر الذي يتطلب منا معرفة نوع ITEM . يؤدي هذا إلى إنشاء دائرة لا يمكننا حلها ، لذلك نعود إلى نوع any ضمني.

يمكننا إصلاح ذلك من خلال جعل منطق التعرف على النوع يقوم أولاً بحل نوع كائن الوظيفة وفحص جميع تواقيع المكالمة. إذا لم يكن أي منها عبارة عن مسندات من النوع المحدد من قبل المستخدم ، فيمكننا الإنقاذ مبكرًا دون حل تعبيرات وسيطة المكالمة ، والتي تتجنب الاستدارة.

في غضون ذلك ، يمكنك كسر الدائرة ببساطة عن طريق إضافة الأقواس إلى arg في الاستدعاء إلى otherFunc . بمعنى آخر ، قم بتغيير المكالمة إلى otherFunc(ITEM, (arg)) . يؤدي هذا إلى عدم اعتبار محلل تدفق التحكم في المكالمة استدعاءًا أصليًا للنوع المحدد من قِبل المستخدم.

ال 3 كومينتر

هذه مسألة تحليل تدفق التحكم. لاستنتاج نوع ITEM نحتاج إلى معرفة نوع تدفق التحكم وهو arg.arr . وهذا بدوره يعني أننا بحاجة إلى النظر في التركيبات التي تؤثر على نوع arg . يتضمن هذا استدعاء otherFunc الذي يبدو أنه _ يمكن_ أن يكون مسند نوع محدد من قبل المستخدم. من أجل تحديد ما إذا كانت _is_ مسند نوع ، نقوم بحل تعبير الاستدعاء ، الذي يستلزم حل تعبيرات الوسيطات ، الأمر الذي يتطلب منا معرفة نوع ITEM . يؤدي هذا إلى إنشاء دائرة لا يمكننا حلها ، لذلك نعود إلى نوع any ضمني.

يمكننا إصلاح ذلك من خلال جعل منطق التعرف على النوع يقوم أولاً بحل نوع كائن الوظيفة وفحص جميع تواقيع المكالمة. إذا لم يكن أي منها عبارة عن مسندات من النوع المحدد من قبل المستخدم ، فيمكننا الإنقاذ مبكرًا دون حل تعبيرات وسيطة المكالمة ، والتي تتجنب الاستدارة.

في غضون ذلك ، يمكنك كسر الدائرة ببساطة عن طريق إضافة الأقواس إلى arg في الاستدعاء إلى otherFunc . بمعنى آخر ، قم بتغيير المكالمة إلى otherFunc(ITEM, (arg)) . يؤدي هذا إلى عدم اعتبار محلل تدفق التحكم في المكالمة استدعاءًا أصليًا للنوع المحدد من قِبل المستخدم.

تضمين التغريدة
شكرا لك على الحل البديل الأقواس.
اريد ان اعرف هذا العلاقات العامة مقبولة ، أليس كذلك؟

arusakov الإصلاح الآن في الماجستير!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات