إصدار 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
هذا هو الحد الفاصل. الوظيفة
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_ خطأ.
جانبا ، أقترح تجنب إتلاف المعلمات في التوقيعات غير التنفيذية. إنها حقًا تفاصيل تنفيذية ، أي ما إذا كان تنفيذ الوظيفة يدمر الوسيطة أو يستخدم فقط الوصول إلى الخاصية ، فلا ينبغي أن يشغل المتصل حقًا. ومع ذلك ، في حالة ملف الإعلان ، نظرًا لعدم وجود اسم معلمة فعلي لإصداره ، فإننا (على مضض) نصدر نمط التدمير ولذا نحتاج إلى إصلاح الخطأ.
التعليق الأكثر فائدة
هذا هو الحد الفاصل. الوظيفة
هو في الواقع خطأ لأن الحجة التي تحاول إتلافها قد تكون
undefined
. لذلك ، لن يكون تنفيذ التوقيع الدقيق الذي لديك في مثالك ممكنًا. الآن ، إذا قمت بتغيير الإعلان إلىلم يعد خطأ لأنه سيتم استبدال
undefined
بالقيمة الافتراضية. ومع ذلك ، من منظور المتصلين ، لا تزال المعلمة اختيارية وإذا قمت الآن بإنشاء ملف إعلان ، فإننا نبصق الإعلانالذي يسبب خطأ. و _that_ خطأ.
جانبا ، أقترح تجنب إتلاف المعلمات في التوقيعات غير التنفيذية. إنها حقًا تفاصيل تنفيذية ، أي ما إذا كان تنفيذ الوظيفة يدمر الوسيطة أو يستخدم فقط الوصول إلى الخاصية ، فلا ينبغي أن يشغل المتصل حقًا. ومع ذلك ، في حالة ملف الإعلان ، نظرًا لعدم وجود اسم معلمة فعلي لإصداره ، فإننا (على مضض) نصدر نمط التدمير ولذا نحتاج إلى إصلاح الخطأ.