Typescript: لا تلعب الأنواع غير القابلة للإلغاء بشكل جيد مع التدمير الاختياري (ng2)

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

إصدار TypeScript:

ليلاً (1.9.0-dev.20160217)

شفرة

export interface QueryMetadataFactory {
    (selector: Type | string, {descendants, read}?: {
        descendants?: boolean;
        read?: any;
    }): ParameterDecorator;
    new (selector: Type | string, {descendants, read}?: {
        descendants?: boolean;
        read?: any;
    }): QueryMetadata;
}

سلوك متوقع:
عند تجميع هذا باستخدام فحوصات فارغة صارمة ، أتوقع أن يتم تجميع ذلك ، حيث تم وضع علامة على المتغيرات المدمرة على أنها اختيارية ، لأن هذا يعمل:

export interface QueryMetadataFactory {
    (selector: Type | string, whatever?: {
        descendants?: boolean;
        read?: any;
    }): ParameterDecorator;
    new (selector: Type | string, whatever?: {
        descendants?: boolean;
        read?: any;
    }): QueryMetadata;
}

السلوك الفعلي:
عند التجميع:

node_modules/@angular/core/src/metadata.d.ts(356,32): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(356,45): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,36): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'descendants' and no string index signature.
node_modules/@angular/core/src/metadata.d.ts(360,49): error TS2459: Type '{ descendants?: boolean | undefined; read?: any; } | undefined' has no property 'read' and no string index signatu
Bug

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

هذا هو الحد الفاصل. الوظيفة

function foo({ a, b }?: { a: number, b: number }) {
}

هو في الواقع خطأ لأن الحجة التي تحاول إتلافها قد تكون undefined . لذلك ، لن يكون تنفيذ التوقيع الدقيق الذي لديك في مثالك ممكنًا. الآن ، إذا قمت بتغيير الإعلان إلى

function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}

لم يعد خطأ لأنه سيتم استبدال undefined بالقيمة الافتراضية. ومع ذلك ، من منظور المتصلين ، لا تزال المعلمة اختيارية وإذا قمت الآن بإنشاء ملف إعلان ، فإننا نبصق الإعلان

declare function foo({ a, b }?: { a: number, b: number }): void;

الذي يسبب خطأ. و _that_ خطأ.

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

>كل التعليقات

هذا هو الحد الفاصل. الوظيفة

function foo({ a, b }?: { a: number, b: number }) {
}

هو في الواقع خطأ لأن الحجة التي تحاول إتلافها قد تكون undefined . لذلك ، لن يكون تنفيذ التوقيع الدقيق الذي لديك في مثالك ممكنًا. الآن ، إذا قمت بتغيير الإعلان إلى

function foo({ a, b }: { a: number, b: number } = { a: 0, b: 0 }) {
}

لم يعد خطأ لأنه سيتم استبدال undefined بالقيمة الافتراضية. ومع ذلك ، من منظور المتصلين ، لا تزال المعلمة اختيارية وإذا قمت الآن بإنشاء ملف إعلان ، فإننا نبصق الإعلان

declare function foo({ a, b }?: { a: number, b: number }): void;

الذي يسبب خطأ. و _that_ خطأ.

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

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

القضايا ذات الصلة

weswigham picture weswigham  ·  3تعليقات

siddjain picture siddjain  ·  3تعليقات

remojansen picture remojansen  ·  3تعليقات

bgrieder picture bgrieder  ·  3تعليقات

blendsdk picture blendsdk  ·  3تعليقات