Typescript: القدرة على تجاوز طاقة TS وتجاهل خطأ معين من قبل المطور

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

يجب أن يكون المطور قادرًا على إضافة تعليق فوق خطأ ts مثل

/// TS_IGNORE
let a:string = 1

وجعل المترجم لا يبلغ عن هذا الخطأ ...
هناك سيناريوهات معينة يعرفها المطور بشكل أفضل ويريد تهدئة تقارير الأخطاء.

نوع من الإعجاب: أي

مع تحياتي

شون

Fixed Suggestion

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

فقط قم بإلقائها (طاقم التمثيل ليس مصطلحًا رسميًا ، ولكن نفس المفهوم)

const foo: string = 7 as any;

هل هذا ما تبحث عنه؟

ال 150 كومينتر

متفق. الشوق لشيء مثل @SuppressWarnings لجافا ، خاصة بالنسبة للحالة الموضحة هنا :

الأتى:

const typeMetadataKey = Symbol('type');

function type(name: string): PropertyDescriptor {
 return Reflect.metadata(typeMetadataKey, name);
}

ينتج الخطأ: Unable to resolve signature of class decorator when called as an expression. .

عند استخدامها على النحو التالي:

class Person {
  @type('string')
  firstName: string;
}

يعمل المصمم كما هو متوقع وسيجمع ولكنه يعطي الخطأ أعلاه.

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

فقط قم بإلقائها (طاقم التمثيل ليس مصطلحًا رسميًا ، ولكن نفس المفهوم)

const foo: string = 7 as any;

هل هذا ما تبحث عنه؟

لقد أعطيت للتو مثالاً ، وليس حالة (أعرف كل شيء عن اختيار الممثلين) ، لدي حالات أخرى مثل
يتم استدعاء السوبر بعد السطر الأول من المُنشئ ومشكلات أخرى ...

  • سيجعل الانتقال إلى TS أسهل من JS + في وقت ما تقوم بتغيير lib وتحصل على الكثير من الأخطاء وتريد فقط تنظيف الأشياء كما تعلم كمطور للسبب ...

هذه ميزة مهمة

شيء مثل // tslint:disable ؟
ربما مما يتيح لك تشغيل / إيقاف الشيكات الخاصة tsc ينفذ؟
_eg: _ const FooBar: string = 'rozzzly'; // tslint:disable-line camelcase

سيكون هذا رائعا...

لا أعرف ... أعتقد أن هذا قد يكون خارج نطاق tsc . هذا ما هو لينتيرس.

يجب أن تكون قادرة على "اخرس" :)

أعتقد أن هناك قضية يمكن مناقشتها لإخفاء الأخطاء / التحذيرات بشأن الميزات "التجريبية" ، مثل أدوات التزيين ، حيث تكون واجهة برمجة التطبيقات متقلبة بعض الشيء وقد لا تكون الأخطاء دقيقة دائمًا. يمكنك الحصول على نسخة (محددة جدًا) من هذا فقط باستخدام حقل tsconfig "النموذجي للديكورات" ، لكنه يمنع نوعًا واحدًا فقط من التحذير.

لألعب دور محامي الشيطان الخاص بي ، قد يشجع هذا المستخدمين الجدد لـ TypeScript على قمع التحذيرات التي لا يفهمونها بدلاً من معرفة سبب حدوث التحذير. وباستخدام الميزات التجريبية ، يعد كل شخص نوعًا ما مستخدمًا جديدًا - فامتلاك القدرة على قمع الأخطاء قد يجعل المستخدمين راضين عن الأخطاء في الميزات الجديدة ، بدلاً من فتح المشكلات.

في النهاية ، ما زلت أريد أن يكون إخراج Syntastic نظيفًا. مما يعني قمع الخطأ. بالطبع ، سيكون ذلك بعد _ أفتح المشكلة بحثًا عن خطأ محتمل وأحاول معرفة المزيد. ؛)

مشكلة "اسكته" هي أنك لا تعرف ما الذي تحصل عليه من "ذلك". إذن هل let a:string = 1 a number أو string ؟ ، ماذا لو كان هناك إعلان آخر عن a ، هل يتم دمجه أم لا؟ ماذا لو التقط شخص ما نوع هذا المتغير على سبيل المثال return {a} ; ، فهل يجب تخصيصه لـ { a : number } أو { a: string } أو كليهما.

شيء أساسي واحد ، الأخطاء كلها دنيئة. لا تمنع الأخطاء توليد النواتج ولا الأدوات.

هناك آليات مختلفة للسماح لك بمنع التحقق من أجزاء معينة من التعليمات البرمجية الخاصة بك ، على سبيل المثال any ، اكتب التأكيدات (casts) ، والإعلان المحيط.

على سبيل المثال ، إذا كانت لديك مكتبة بها تعريف "غير صالح" ، فيمكنك إزالتها واستبدالها بـ declare module "blah" { export = any } . أو declare var $: any وأنت على ما يرام.

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

ولهذا نحتاج إلى معرفة المزيد عن حالة الاستخدام الخاصة بك.

لقد قمنا ببعض العمل في TS 2.0 لحل بعض هذه القضايا الأساسية ، على سبيل المثال ؛

فقط استخدم أيًا منها ، هذه هي الطريقة التي "يصمت بها" ، مزايا القيام بذلك (أو في الواقع عدم وجودها) هي مسألة مختلفة

let x: PieInTheSky = <any> 'cake is a lie';

حسنًا ، ولكن مرة أخرى ، لا تتعلق المشكلة بالتحديد بالإرسال

يمنحك <any> vanila javascript مع حرية بنسبة 100٪ من جميع الأشياء المزعجة في TypeScript ، فما الذي تحتاجه أيضًا؟

في حالتي ، أسمي super not as fisrt line of constructor وأحتاج إلى تهدئة الخطأ

بدلاً من محاولة إجباره على قبول مضاد ، لماذا لا تكتب جرب شيئًا مثل هذا:

_ ClassA.ts _

class A {
    constructor() {
        this.init();
    }
    protected init() {
        // does nothing by itself
    }
}

_ ClassB.ts _

class B extends A {
    constructor() {
        super();
        console.log('rest of code from B\'s constructor');
    }
    protected init() {
        console.log('this runs before the rest of code from B\'s constructor');
    }
}

هذا ما يجعل الكتابة المطبوعة رائعة جدًا ومزعجة أيضًا. يجبرك على كتابة كود أفضل ويجعلك مطورًا أفضل. تحويل مشروع ليس ممتعا ؛ قد تعتبره بمثابة "بداية" للمطور أو ربما "تجربة بالنار". : يضحك: لكنك تتعلم الكثير ، والأمر يستحق ذلك تمامًا.

في حالتي ، أسمي super not as fisrt line of constructor وأحتاج إلى تهدئة الخطأ

واجعل الكود الخاص بك غير متوافق مع ES6 ... وهذا هو بالضبط سبب الغرض الرئيسي من TypeScript هو إخراج 👣: gun: من بين يديك.

إذا كان TypeScript لا يفسر شيئًا ما بشكل صحيح ، فيجب أن يتم إصلاحه مقابل "حل المشكلة". يوجد الآن عدد قليل من الأشياء حيث تعمل TypeScript أكثر مثل linter ولا يوجد حتى الآن مفهوم "خطأ" مقابل "تحذير". أستطيع أن أرى التحذيرات القاتلة عندما تأتي. أشياء مثل الكود بعد الإرجاع والمعلمات غير المستخدمة يجب أن تكون تحذيرات في رأيي ، لأنها صحيحة نحويًا (رغم أنها غبية).

إليك حالة أخرى أحب أن أحصل فيها على هذه الميزة:

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

class Dog implements Animal {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

يوجد الآن خطأ من TS:

[ts] نفذت الفئة "كلب" واجهة "حيوان" بشكل غير صحيح
الخاصية "numberOfLegs" مفقودة في النوع "Dog"

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

DethAriel في الأساس ما تطلبه هو طريقة للتعبير عن الآثار الجانبية لحالة النشر في نظام الكتابة. هذا مثير للاهتمام ولكن لدي شعور أنه سيؤدي إلى بعض التعليمات البرمجية المعقدة بشكل رهيب.

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

مجرد استخدام واجهة + فئة التحرير والسرد

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

interface Dog extends Animal {
}

class Dog  {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

Thx ، mhegazy ، لقد

ماذا لو كان الخطأ لا يمكن أن يكون بعيدًا عن <any> ed؟

أنا أستخدم بناء جملة الربط التجريبي كما تمت مناقشته هنا https://github.com/Microsoft/TypeScript/issues/3508 وبغض النظر عن عدم استخدامه ، فأنا غير قادر على جعل المترجم يتجاهل الخطأ في كل سطر قبل كل :: عامل التشغيل TS1128: Declaration or statement expected )

أنا باستخدام صيغة الربط التجريبية

هذا في الحقيقة أكثر من مجرد تجاهل تحذير واحد. لا يدعمها المحلل اللغوي ، وبالتالي فإن الشجرة الناتجة خاطئة تمامًا ، ولن تعمل جميع ميزات المحول البرمجي من هذه النقطة فصاعدًا ، لذلك لا يوجد استدلال نوع ، ولا فحوصات توافق ، ولا تنسيق ، ولا اكتمال ، ولا شيء. لذلك سيكون من الأفضل لك تجاهل جميع الأخطاء ، أو مجرد العمل في ملف .js.

أقوم حاليًا بتحويل مشروع JS ضخم إلى نص مطبوع وبعد إجراء التحويل عندما أقوم بتشغيل الأمر gulp build أرى حوالي 2000 خطأ TS أثناء التجميع وترتبط غالبية الأخطاء بخاصية غير محددة في فئة أو وحدة لا معرف. أعتقد أنه يجب أن تكون هناك طريقة ما لمنع هذه الأنواع من الأخطاء حيث يتم إنشاء ملفات JS الناتجة.

هذه هي حالتي تمامًا أيضًا ، لقد قمت بتحويل تطبيق تم إنشاؤه باستخدام تصميم الوحدات النمطية كخصائص ما قبل ES6 ، لذلك لديّ تطبيق ضخم app.namespace1.namespace2.something.views.view -like object.

أعدت كتابة جزء منه وأعتمد على التطبيق العالمي. * الكائن وعناصره الفرعية المختلفة في الكود الخاص بي. كل ما أحصل عليه هو مجموعة من تحذيرات "لا يمكن العثور على مساحة الاسم" التطبيق "".

لقد قمت بإعادة هيكلة جميع تبعياتي العالمية إلى globalProxy.ts ، لذلك هذا هو المكان الوحيد الذي أتلقى فيه التحذيرات ، ولكن سيكون من الرائع إضافة // TS-NO-WARNINGS في الجزء العلوي من هذا الملف لتنظيف وحدة التحكم من الرسائل الواضحة ...

لا تمنع أخطاء TS إنشاء الكود. يمكنك اختيار تجاهلها ، ولكن ما يقوله لك هذا هو أن المترجم لا يمكنه تأكيد صحة التعليمات البرمجية الخاصة بك.

@ zeeshanjan82 لماذا لا تستخدم --allowJs وترحل ملفًا تلو الآخر؟ مع هذا الإعداد لن تحصل على أخطاء الكتابة من مصادر جافا سكريبت. يمكنك أيضًا استخدام إعلان أحرف البدل المحيطة لمنع أخطاء دقة الوحدة النمطية مثل
_globals.d.ts_

declare module '*';

إليك حالة استخدام أخرى لمنع الأخطاء.

نسى مشرفو مكتبة اللحظة إضافة isoWeek كسلسلة صحيحة إلى تعداد المعلمة لطريقتين startOf و endOf . تم إصلاحه في إصدار لاحق ، لكنهم بذلك أعادوا بناء الطريقة التي يتم بها التعامل مع هذه الوحدات ، مما قد يتسبب في الكثير من إعادة العمل من جانبنا.

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

يمكنك فقط إضافة نسخة محلية. قل شيئًا بسيطًا مثل:

// ./overrides/moment.d.ts
declare module "moment";
// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "baseUrl": ".",
        "paths": {
            "moment": ["overrides/moment.d.ts"]  // override definition for moment
        }
    }
}

الآن سيقوم المترجم بالتحقق من نسختك المحلية من override/moment.d.ts بدلاً من النسخة التي تأتي مع الحزمة. من الواضح أن هذه يمكن أن تكون نسخة محلية من ملف إعلان اللحظة ، أو مجموعة صغيرة من الأشياء التي تحتاجها.

أفتقر إلى الوقت والرغبة في الاحتفاظ بتعريفات الكتابة الخاصة بي لمكتبات الطرف الثالث ؛)

أفتقر إلى الوقت والرغبة في الاحتفاظ بتعريفات الكتابة الخاصة بي لمكتبات الطرف الثالث ؛)

وهذا جيد تمامًا. فقط استخدم declare module "moment"; وهو ما يعادل declare var $: any للوحدات النمطية ، ولن يزعجك المجمع بشأنه مرة أخرى.

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

الجانب السلبي لإضافة declare module "moment"; هو أنه لن يكون لديك أي IDE intellisense أو نوع ثابت للتحقق من أي رمز متعلق باللحظة. وتميل قيم any التي تظهر إلى النزف إلى الكود المحيط ، مما يؤدي إلى إغلاق العديد من عمليات التحقق الثابتة هناك أيضًا. إنه ثمن باهظ يجب دفعه مقابل قمع الأخطاء المتعلقة بقيمة تعداد واحدة معضلة.

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

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

لدي هذه المشكلة مع مكتبة العقدة الأساسية (net، node 6.9 LTS):

server = net.createServer({ pauseOnConnect: true }, function(connection) { ... }) 
// [ts] severity: 'Error'
message: 'Argument of type '{ pauseOnConnect: boolean; }' is not assignable to parameter of type '{ allowHalfOpen?: boolean; }'.
  Object literal may only specify known properties, and 'pauseOnConnect' does not exist in type '{ allowHalfOpen?: boolean; }'.'

وأيضًا مع مكتبة ioredis:

var redis = new Redis(CONFIG.redis); 
// [ts] severity: 'Error'
message: 'Only a void function can be called with the 'new' keyword.'

كماyortus وadamreisnz أشار، وهذا هو مشكلة شائعة لا يتم تحديث ملفات التعريف دائما بشكل صحيح. بالإضافة إلى ذلك ، إذا كان عليك التضحية بمزايا TS باستخدام declare module "x"; فلماذا تستخدم TS في المقام الأول؟

يمكنك أيضًا زيادة الوحدة بالأنواع المفقودة حتى لا تفقد الذكاء.

حسنًا ، عندما أكتب:

if (typeof Symbol === "function" && Symbol.match) {
  // ...
}

يُبلغ المحول البرمجي من نوع الكتابة دائمًا عن خطأ Cannot find name 'Symbol' إذا كان target هو es5 ، على الرغم من أن هذا الرمز يعمل جيدًا كما توقعت.

لذلك أوافق على أننا بحاجة ماسة إلى بعض توجيهات التحكم التي تعمل في سطور التعليقات.

declare var Symbol: any;

@ gdh1995mhegazy أو مجرد استخدام الإصلاح الحقيقي الذي وضع lib العلم es2015 .

mhegazy شكرا. أجد أن هذا يعمل بشكل جيد:

declare var Symbol: {
  (description?: anyNotSymbol): symbol;
  readonly match: symbol;
};

DanielRosenwasser على الرغم من أن es2015 يضيف هذه الميزات المفيدة ، إلا أن مشروعي محدود ليكون متوافقًا مع es5 ثم يجب تجنب Symbol في الملفات الأخرى.

ما لا أفهمه الآن هو أن مترجم TypeScript يعطيني أخطاء حتى عندما أكتب typeof Symbol === "function" . اي نصيحه؟

إحدى الحالات التي أحب أن أعرضها هي السخرية من التبعيات:

// Test.ts

// Component to test
import {ComponentToTest} from './ComponentToTest';

// Dependency of ComponentToTest to mock
import {Dependency} from './Dependency';

// Mock to replace it with
import {MockedDependency} from './MockedDependency';

Dependency = MockedDependency;

هذا الرمز له التأثير المطلوب المتمثل في الاستهزاء بالتبعية داخل المكون الذي تم اختباره ولكن TypeScript يلقي بعبارة واضحة "لا يمكن التخصيص إلى" التبعية "لأنه ليس متغيرًا." خطأ.

أنا متأكد من أن الرد سيكون أنني أنبح الشجرة الخطأ ويجب أن أستخدم شيئًا مثل inject-loader لكن من تجربتي هذه الحلول A) هي ألم للعمل / لا تفعل دائمًا work and B) ليست بهذه البساطة كما ورد أعلاه. كما ذكر OP ، أحيانًا يكون المطور هو الأفضل. أعلم أن هذا حل مبتكر ولكنه يعمل وأحب أن يصمت TS في هذه الحالة.

هذا الرمز له التأثير المطلوب المتمثل في الاستهزاء بالتبعية داخل المكون الذي تم اختباره ولكن TypeScript يلقي بعبارة واضحة "لا يمكن التخصيص إلى" التبعية "لأنه ليس متغيرًا." خطأ.

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

بدلاً من ذلك ، يمكنك الحصول على ComponentToTest الخاص بك يقبل وسيطة لـ Dependency ، ويمكن أن تجتاز اختباراتك ذلك ، أو أن يكون لديك اختبار يسمح لك بتجاوز قيمة Dependency قبل استدعاء الطرق على ComponentToTest .

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

آه ، عادل بما يكفي ، سأقوم بإسقاطه إذًا لأن هذا المطلب عرضي لهذه المشكلة.

بدلاً من ذلك ، يمكنك جعل ComponentToTest الخاص بك يقبل وسيطة لـ Dependency ، ويمكن أن تجتاز اختباراتك ذلك ...

أعتقد أن هذا ما انتهى بنا الأمر معه. إنه لأمر ضعيف للغاية أن تضطر إلى إعادة تعريف واجهة برمجة التطبيقات للفصل لجعلها قابلة للاختبار ولكن بعد ذلك أعتقد أن هذه ليست مشكلة فريدة بالنسبة لـ TS على الإطلاق.

شكرا لملاحظاتك ، mhegazy

أود تجاوز التحقق من نوع وسيطة الدالة.

حالة الاستخدام الخاصة بي بسيطة للغاية ، ولدي وظيفة مثل هذه:

function isValidId(s: string): boolean {}

التي تتحقق مما إذا كانت السلسلة تتبع بعض القواعد.
يتم استخدامه داخليًا وللتحقق من صحة إدخال المستخدم - أود كتابة اختبارات لمعرفة ما إذا كانت تُرجع false عندما يُدرج المستخدم شيئًا ليس سلسلة.

بالمعنى الدقيق للكلمة ، يمكن للوظيفة قبول أي شيء كمدخلات لأنها قادرة على إدارته ، ولكن نظرًا لأننا نستخدمها داخليًا أيضًا ، أود تحديد أننا نريد سلسلة

لذلك ، أرغب في شيء ما لمنع الخطأ المتعلق بالتنسيق الخاطئ في الاختبارات

rpadovani فقط استخدم any :

expect(isValidId(78 as any)).toBe(false);

يمكنني استخدام هذا أيضا. لدينا حالة يتم فيها تعريف foo (bar: any، baz: any) كجزء من إطار عمل ، ولكن في بعض تطبيقات foo ، لا يتم استخدام bar. مع تشغيل فحص الأخطاء المطبوع عليها ، يؤدي هذا إلى ظهور خطأ لأنه تم التصريح عن متغير غير مستخدم. يجب التصريح عنه ، لأنه يتم استخدام إصدارات أخرى من foo، bar.

benjaminabbitt يبدو أن foo (_bar: any, baz: any) يناسبك: اسم يبدأ بـ "_" غير مجبر على استخدامه.

إضافة: أعتقد أن القدرة على تجاوز / تجاهل الأخطاء الخاصة أمر مهم.

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

ما هي الطريقة المناسبة للتعامل مع كود جافا سكريبت الخاص بطرف ثالث والتي نرغب في تضمينها في مشاريعنا؟

ضع في اعتبارك السيناريو التالي. هناك مكتبة ضخمة لم يتم نشرها حتى npm وحتى لو كانت كذلك ، فإن استخدام المكتبة كما هي سيجعل تطبيقنا يحمل الكثير من الأكواد الميتة (لا يمكن أن يساعد اهتزاز الشجرة لأنها تعلق كل شيء بكائن ما).

لنفترض أنه في هذه الحالة ، لا يستحق استخراج هذا الجزء من التعليمات البرمجية ونشره في npm. ما هي الخيارات الأخرى لدينا؟

في محاولتي لاستخدام هذه المكتبة ، قمت باستخراج الكود الذي يحتاجه مشروعي ودمجه في المشروع كملف مطبوع. تكمن المشكلة في أن المطبوع عليه يتحقق من هذا الملف ويعطي الآن الكثير من الأخطاء لهذا الملف.

بالنسبة لهذا الموقف ، سيكون من الرائع أن يكون لديك التعليق /* ts:disable */ في الجزء العلوي حتى يعلم هذا النوع من الكتابة أننا لا نهتم بالأخطاء المحتملة داخل الملف.

يرجى ملاحظة أن مشروعي لم يعد يلتزم بأي ملفات جافا سكريبت بعد الآن ، وحتى إذا تم ذلك ، فستصبح عملية الإنشاء أكثر تعقيدًا في محاولة استيعاب جافا سكريبت في التدفق.

هل لدى أي شخص أي نصيحة حول كيفية التعامل مع كود جافا سكريبت لطرف ثالث يحتاج إلى استضافته في مشروع مطبوع؟

هل لدى أي شخص أي نصيحة حول كيفية التعامل مع كود JavaScript لطرف ثالث يحتاج إلى استضافته في مشروع مطبوع؟

لا تهاجرهم. اترك ملفات .js كما هي. قم بإنشاء ملف .d.ts بدلاً من ذلك. هذا هو ما ملفات .d.ts لأية طريقة.

يمكن أن يبدأ ملف .d.ts بشيء أساسي مثل:

declare var $: any;

ثم أضف إليها كما تراه مناسبًا ، وكلما زادت احتياجاتك.

هذا خيار جيد إذا كنت ألتزم بملفات js. هل هناك أي خيارات أخرى للمشاريع التي تتجاهل ملفات js؟

هذا خيار جيد إذا كنت ألتزم بملفات js. هل هناك أي خيارات أخرى للمشاريع التي تتجاهل ملفات js؟

لست متأكدًا من فهمي للسؤال. يتم تجاهل ملفات JS افتراضيًا. لذلك يمكنك الاشتراك في إضافة الملفات. مرة أخرى ، توصيتي ، بالنسبة للكود الخارجي الذي لا يخصك ، أو للرمز القديم الذي لا تنوي تغييره ، لا تهتم بتحويله إلى TS. ابدأ بكتابة ملف .d.ts لهم. لهذا ، ابدأ بسيطًا ، باستخدام any ثم قم بالإضافة كما تذهب.

كان يجب أن أقول إن ملفات js ليست ملتزمة بمستودع git ، وبالتالي سبب وضع الكود في ملف ts. على أي حال ، سأحاول السير في الطريق الذي ذكرته وفرض تنفيذ هذه الملفات js.

لا تحتاج إلى تثبيت ملفات .js. لنفترض أنك تستخدم تبعية ، ولنقل رد فعل. عادةً لن تلتزم بـ react-0.12.0.js في الريبو الخاص بك ، لكنك تريد استخدامه. نورمللي يمكنك تضمين هذا في علامة sccript من CDN على سبيل المثال. لنفترض أيضًا أن @types/react غير موجود ، أو أنك لا تريد استخدامه. لذلك أضف ملف إقرار جديد في مشروعك واسمه declarations.d.ts وأضف:

declare module "react"; // just saying the module is of type any

هذا يخبر المترجم أن هناك وحدة تسمى "رد فعل" وسوف يستخدمها فقط ، ولا حاجة لتضمين أي ملفات .js.

لذلك إذا كنت أرغب في استخدام جزء صغير من جافا سكريبت (غير متوفر عبر npm / CDN) وقررت أن ألزمه بقاعدة الشفرة الخاصة بي ، فلدي خياران:

الخيار 1 : احتفظ بالشفرة الأصلية كملف .js واحتفظ بملف .d.ts للتعامل مع الأنواع.

أعتقد أن هذا لا يعمل مع @ jmlopez-rod لأنه لا يريد الالتزام برمز جافا سكريبت في الريبو الخاص به ، وحتى لو فعل ذلك ، فقد قال إن ذلك سيجعل عملية الإنشاء معقدة.

الخيار 2 : لف جافا سكريبت في الكتابة المطبوعة والتعامل مع جميع أخطاء الكتابة.

هذا يتخطى "عملية الإنشاء المعقدة" لأنها ستتعامل مع الشفرة مثل الكتابة المطبوعة ... ولكن لدينا الآن أخطاء مطبوعة ، وقد عدنا إلى المناقشة الأصلية في سلسلة المشكلة هذه. هل هذه حالة استخدام صالحة للقدرة على تعطيل أخطاء الكتابة المطبوعة؟

أعتقد أن هذا لا يعمل مع @ jmlopez-rod لأنه لا يريد الالتزام برمز جافا سكريبت في الريبو الخاص به ، وحتى لو فعل ذلك ، فقد قال إن ذلك سيجعل عملية الإنشاء معقدة.

لست متأكدًا من أنني أفهم سبب تعقيد عملية البناء الخاصة بك. لديك ملف "library.js" و "website.js" ، قررت نقل "website.js" إلى "website.ts" ، فقط اتصل بـ tsc website.ts --outFile website.js والآن عدنا حيث كل شيء بدأت بملفي .js. لذلك لا ترى سبب تعقيدها أكثر من ذي قبل .. إنها مجرد خطوة بناء إضافية في رأس السلسلة.

هذا يتخطى "عملية الإنشاء المعقدة" لأنها ستتعامل مع الشفرة مثل الكتابة المطبوعة ... ولكن لدينا الآن أخطاء مطبوعة ، وقد عدنا إلى المناقشة الأصلية في سلسلة المشكلة هذه. هل هذه حالة استخدام صالحة للقدرة على تعطيل أخطاء الكتابة المطبوعة؟

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

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

لم أستطع أن أفهم لماذا لا يعمل بيان المحيط هذا بالنسبة لي.
لقد حددت بالفعل تعريف المسارات إلى tsconfig.json مثل هذا
"paths": { "js-xlsx": ["./xlsx.d.ts"] }
ولكن ما زلت أتيت عبر هذه الوحدة لم يتم العثور على خطأ.
حاولت إضافة "fs" و "fs-extra" وأن مكتبات "js-xlsx" جميعها لم تستجب لإعلاناتي أو عمليات الصب أو إضافة أي أنواع كما هو الحال هنا declare var $: any;
تضمين التغريدة

لا تحتاج إلى تثبيت ملفات .js. لنفترض أنك تستخدم تبعية ، ولنقل رد فعل. عادةً لن تلتزم response-0.12.0.js في الريبو الخاص بك ، لكنك تريد استخدامه. نورمللي يمكنك تضمين هذا في علامة sccript من CDN على سبيل المثال. لنفترض أيضًا أن @ type / رد فعل غير موجود ، أو أنك لا تريد استخدامه. لذلك أضف في مشروعك ملف إقرار جديد أطلق عليه اسم "الإعلانات. d.ts" وأضف:

إعلان وحدة "رد فعل" ؛ // فقط أقول إن الوحدة من النوع أي
هذا يخبر المترجم أن هناك وحدة تسمى "رد فعل" وسوف يستخدمها فقط ، ولا حاجة لتضمين أي ملفات .js.

بالمناسبة ، أعلم أن مكتبة fs-extra لها تعريف النوع مثل @ types / fs-extra وبالنسبة إلى js-xlsx ، لدينا مكتبات ts-xlsx ، لكن هذا غريب جدًا لدرجة أن هذه الحيل لا تعمل بالنسبة لي :(

بالمناسبة ، أعلم أن مكتبة fs-extra لها تعريف النوع مثل @ types / fs-extra وبالنسبة إلى js-xlsx ، لدينا مكتبات ts-xlsx ، لكن هذا غريب جدًا لدرجة أن هذه الحيل لا تعمل بالنسبة لي :(

أعتقد أن هناك شيئًا آخر يجري في مشروعك.

c:\test\9448>npm install @types/fs-extra
[email protected] c:\test\9448
`-- @types/[email protected]
  `-- @types/[email protected]

npm WARN [email protected] No description
npm WARN [email protected] No repository field.

c:\test\9448>type a.ts
import { rmdir } from "fs-extra";
rmdir("c:/test");

c:\test\9448>type tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5"
    }
}
c:\test\9448>tsc --v
Version 2.2.0

c:\test\9448>tsc

c:\test\9448>echo %ERRORLEVEL%
0

نعم ، ربما ولكن ، المشكلة الرئيسية التي لم أستطع فهمها هي لماذا لا يمكنني الضغط على تحذيرات المترجم بالطرق المحددة. بالمناسبة لدي https://github.com/AngularClass/angular2-webpack-starter ، قاعدة لمشروعي

قمع الأخطاء لا يعني بالضرورة إدخال أنماط مضادة.

أتلقى خطأ غير صحيح ،

error TS1005: '{' expected.

على هذا JSX الجيد تمامًا:

<motor-node ref      = 'menu'
    absoluteSize     = `0, ${this.MENU_BAR_HEIGHT}, 0`
    >
    {menu}
</motor-node>,

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

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

هكذا قال. وفقًا لمواصفات JSX :

JSXAttributeValue:

"JSXDoubleStringCharactersopt"
"JSXSingleStringCharactersopt"
{AssignmentExpression}
JSXElement

لذلك أخشى أن الخطأ صحيح ولا يمكن أن تحتوي سمة JSX على قالب سلسلة حرفي. يمكنك استخدام absolteSize = {...} بدلا من ذلك

هذا الخطأ هو خطأ تحليل

نعم ، لهذا السبب يجب إصلاحه.

الناتج هو absoluteSize: "0, " + this.MENU_BAR_HEIGHT + ", 0" ، مما يخبرني عن أشياء للمترجم أنه على ما يرام.

أوه. آسف إذن. افتقد فهمت تعليقك. اعتقدت أنك تريد إسكات الخطأ.

لقد فعلت ذلك ، لكنك على حق ، ربما يجب أن أعيش بشكل أفضل بإضافة {} .

في TS 2.1 (VS2017 RC) ، نحصل على تحذيرات مُبلغ عنها قادمة من ملفات JS للمكتبات (الموجودة في / Scripts) مجلد مثل TS7027. سيكون من الجيد أن تكون قادرًا إما على قمع التحذير / الأخطاء من ملفات المكتبة أو على الأقل قمعها في نوع من ملف supression العام (على غرار C # GlobalSupressions.cs)

في TS 2.1 (VS2017 RC) ، نحصل على تحذيرات مُبلغ عنها قادمة من ملفات JS للمكتبات (الموجودة في / Scripts) مجلد مثل TS7027.

للحصول على رمز لا يمكن الوصول إليه (TS 7027) ، قم بتعيين --allowUnreachableCode أو قم بتعيينه في tsconfig.json الخاص بك.

ولكن هل من الممكن تطبيقه فقط على ملفات المكتبة. لأنني في حاجة إليه من أجل "الكود الخاص بي"!

باستخدام --alowJs يصبح الرمز الخاص بك. سيقوم المترجم بامتصاصه ، ونقله إلى الهدف المقترح ، وسيرسله إذا كنت تستخدم --outFile .. إنه يحتوي فقط على امتداد .js. إذا كان رمز "مكتبة" ، فإنني أوصي بإنشاء ملف .d.ts له وتضمينه بدلاً من ذلك.

لست على علم بأننا قمنا بتشغيل --allowJs - في VS2015 ، فإن نفس المشروع بالضبط لا يضغط على ملفات jquery.js ، والتفاعل.js الموجودة في البرامج النصية (وفي الواقع تمت الإشارة إليها فقط من صفحة html بواسطة

let { value } = browser.waitForPromise(() => {
    return browser.executeAsync(function (method, name, resolve) {
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {
            resolve(result);
        });
    }, method, name);
});

في حالتي ، الخط الأول مكتوب بلغة TypeScript ، السطر الثاني مكتوب بلغة JavaScript. يتم تنفيذها في سياقات مختلفة ولا أريد تعديل كود JavaScript.
لذلك ، نحتاج إلى خيار جديد مثل /* ts-disable */ /* ts-enable */ (مثل eslint)

في حالتي ، الخط الأول مكتوب بلغة TypeScript ، السطر الثاني مكتوب بلغة JavaScript. يتم تنفيذها في سياقات مختلفة ولا أريد تعديل كود JavaScript.

لست متأكدًا من فهمي لما تقصده بعبارة "السطر الثاني مكتوب بلغة جافا سكريبت"؟ هل تمرر البيان كاملاً إلى المترجم أم لا؟

لست متأكدًا من فهمي لما تقصده بعبارة "السطر الثاني مكتوب بلغة جافا سكريبت"؟ هل تمرر البيان كاملاً إلى المترجم أم لا؟

لا أريد تعديل هذا الرمز لأنه يجب تمريره إلى خادم السيلينيوم كما هو .

لا أريد تعديل هذا الرمز لأنه يجب تمريره إلى خادم السيلينيوم كما هو.

إذا كان هذا في ملف .ts ، فسيتم تحويله بواسطة المترجم. يقوم المترجم بإزالة التعليقات التوضيحية من النوع نيابة عنك ..

بغض النظر ، بالنسبة لهذه العينة ، كل ما تحتاجه هو declare var browser: any; ولن تحصل على أي أخطاء. انظر ملعب لعينة.

إذا كان هذا في ملف .ts ، فسيتم تحويله بواسطة المترجم. يقوم المترجم بإزالة التعليقات التوضيحية من النوع نيابة عنك ..

أحتاج إلى ضمان بأن رمزًا معينًا قد تم تنفيذه دون أي عائق في IE6 والمتصفحات القديمة الأخرى.
على سبيل المثال ، يتبع Node.js نظام الوحدة النمطية CommonJS ، لكن require هو وظيفة مخصصة تم تحديدها بواسطة مطورين آخرين على صفحاتها. لهذا السبب أود تضمين هذا الرمز دون أي تعديلات لاحقة ومسبقة. إنه مهم بالنسبة لي ولفريقي.

بغض النظر ، بالنسبة لهذه العينة ، كل ما تحتاجه هو التصريح عن متصفح var: أي ؛ ويجب ألا تحصل على أي أخطاء. انظر ملعب لعينة.

في الواقع ، يعد كائن المتصفح هو العنصر الأكثر شيوعًا في مشروعي وليس هناك أي سبب لتجاهله. الطريقة browser.execute لها تعريف خاص بالنوع أيضًا.

الآن لست متأكدًا من أنني أفهم ما هي المشكلة في ذلك الوقت. ما هو الخطأ الذي يظهر لك؟

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

img-2017-03-07-02-10-28

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
            function (method, name, resolve) { // browser
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
            resolve(result);  // browser
        });  // browser
    }, method, name); 
});

إليك تنفيذ بسيط للطريقة browser.executeAsync :

browser.executeAsync  = (...args) => {
   let script = args.shift();

   RPC.Selenium('/session/:sessionId/execute', {
         script: `return (${script}).apply(null, arguments)`, 
         args
    });
}

كما ترى أستخدم TypeScript لاختبار التكامل.

ما هي رسالة الخطأ؟

الأخطاء المعيارية:

TS2345: Argument of type 'string[]' is not assignable to parameter string
TS7006: Parameter 'error' implicitly has an 'any' type
TS7006: Parameter 'attach' implicitly has an 'any' type
TS7006: Parameter 'message' implicitly has an 'any' type
TS7006: Parameter 'model' implicitly has an 'any' type

وما إلى ذلك وهلم جرا...

حدد require بشكل صحيح.

declare function require(v: string[]): any;

تحديد تتطلب بشكل صحيح.

لا استطيع. في حالتي ، تحتوي الطريقة executeAsync على رمز لمشروعات الجهات الخارجية وهناك أشكال مختلفة لمثل هذا require s. الكود أعلاه هو مجرد وظيفة واحدة من المئات.
رغبتي بسيطة للغاية - دعني أستبعد بعض الرموز عندما أحتاجها :)

يمكنك وضع declare function require(v: string[]): any; محليًا. على سبيل المثال:

// module a.ts
export var ...

declare function require(v: string[], callback: Function);

let { value } = browser.waitForPromise(() => { 
    return browser.executeAsync( 
        function (method, name, resolve) { // browser
            require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // OK
                resolve(result);  
            });  
        }, method, name);
});

يمكنك أيضًا الإرسال إلى any عند الحاجة:

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
        function (method, name, resolve) { // browser
            (<any>require)(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
                resolve(result);  // browser
            });  // browser
        }, method, name);
});

هذا يجب أن ينتج رمزًا متطابقًا.

في حالتي ، لدي فئة مجردة خاصة (غير مُصدَّرة) والتي يُقصد منها فقط توسيعها بفئتين:

abstract class IParent {
  static fromConfig(config: ParentConfig): IParent {
    // actual code is 20 lines long, not this simple
    // this throws "Cannot create an instance of the abstract class 'Parent'"
    return new this().applyConfiguration(config);
  }
  abstract method1(): void;
  ...
}

export class FirstChild extends IParent {
  specificMethodForFirstChild() { ... }
  method1() { ... }
  ...
}

export class SecondChild extends IParent {
  specificMethodForSecondChild();
  method1() { ... }
  ...
}

استعمال:

let first = FirstChild.fromConfig({ ... });
let second = SecondChild.fromConfig({ ... });

// this runs successfully:
(first as FirstChild).specificMethodForFirstChild();
(second as SecondChild).specificMethodForSecondChild();

لكن في الطريقة fromConfig() أحصل على "لا يمكن إنشاء مثيل لفئة الملخص" Parent ":

كود الملعب

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

لا يفرض المترجم أن منشئي الفئة المشتقة لديهم نفس توقيع الأساس. بعبارة أخرى ، يمكن أن يحتوي مُنشئ الصنف المشتق على وسيطات مطلوبة أكثر من الأساس. باستخدام new this() يفترض أن جميع المنشئات المشتقة لن تحتوي على معلمات مطلوبة ؛ وهذا شيء لا يمكن التحقق منه.

إذا كنت متأكدًا من صحة ذلك ، ففكر في الإرسال كـ new (<any>this)(x, y);

نقطة جيدة لم أر ذلك. اقتراحك يعمل بالفعل ، سأفكر في المخاطر ، شكرًا.

هل هناك طريقة لكتم صوت Module ... was resolved to ..., but '--allowJs' is not set ؟ في حالة الاستخدام الخاصة بي ، هناك نظام بناء يعتني بذلك ولست بحاجة إلى تمرير كل الكود الخاص بي من خلال TSC ، لذلك أود إسكات هذه الأخطاء.

'التصريح عن الوحدة النمطية "someModule" ؛' في أحد ملفات d.ts.

أو قم بتثبيت حزمة types المطابقة إن وجدت.

لدي مثال آخر على متى سيكون هذا مفيدًا:

const Button = (
  content: contentTypes,
  action: React.EventHandler<React.MouseEvent<HTMLDivElement>>,
  disabled: boolean
): JSX.Element => (
  <div className={`Button disabled-${disabled}`} onTouchStart='' onClick={ !disabled ? action : undefined } >
    { content }
    <div className='background'></div>
  </div>
);

يؤدي هذا إلى ظهور خطأ لأن onTouchStart لا يقبل سلسلة كمعامل وهذا صحيح. ومع ذلك ، يعمل onTouchStart='' إصلاح سلوك css المعطل على الأجهزة التي تعمل باللمس والمتعلقة بقواعد css معينة. لا أرغب في تعطيل هذا الخطأ بشكل عام أو إعادة تعريف بعض أنواع JSX. أود فقط على هذا السطر لإزالة هذا الخطأ.

onTouchStart={<any>''}

هذا في الواقع لا يصلح.
لقد تلقيت هذا الخطأ:
error
انها مكسورة تحت بناء الجملة tsx

onTouchStart={'' as any} ، بدلاً من ذلك (نسيت أن JSX تستخدم صيغة التوكيد البديلة)

هل سيؤهلRyanCavanaugh الكود الذي تم إنشاؤه كحالة استخدام مشروعة لهذه الميزة؟ أنا أستخدم برنامج swagger codegen لإنشاء عميل api لخدمة العقدة. أنا أستخدم أيضًا أنواع العملاء التي تم إنشاؤها في خادمي ، نظرًا لأنه يحول تعريفات swagger إلى واجهات TypeScript ، لذلك فهي أسهل طريقة للتأكد من أنني أحترم عقد التباهي الخاص بي.

الكود الذي تم إنشاؤه غريب بعض الشيء ، ويحتوي على كتل مثل هذا:

let contentTypeHeader: Dictionary<string>;
if (contentTypeHeader) {
    fetchOptions.headers = contentTypeHeader;
}

ينتج عن هذا خطأ إذا كان strictNullChecks قيد التشغيل ، لذلك قمت بإيقاف تشغيل العلامة للمشروع بأكمله. الذي تمتص. لا أريد تحليل النص المكتوب الذي تم إنشاؤه وتعديله ، لكنني سأكون مستعدًا لإدخال شيء مثل <tsc strictNullChecks=false /> في أعلى الملف (على غرار اقتراح alexanderbird ).

ألن يكون هذا طلب تغيير لمولد أكواد swagger لإنتاج كود متوافق مع strictNullChecks؟

mhegazy متأكد - لكن هذا مجرد مثال واحد لشيء كهذا. هناك العديد من الطرق المفيدة لإنشاء الشفرة في TypeScript (أكثر من JavaScript). لذلك ، من الناحية المثالية ، ستكون هناك طريقة لعدم إجبار الأشخاص على سحب مشاريعهم الخاصة إلى معايير الكود الذي تم إنشاؤه.

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

mhegazy أنا موافق على كتم صوت إنذار الحريق في الكود الذي تم إنشاؤه بواسطة أداة تم اختبارها جيدًا. الكود جيد ، فهم لا يستخدمون ميزات اللغة الحديثة ، ولا ينبغي عليهم ذلك.

ماذا عن مثال أقل إثارة للجدل - ماذا لو كانت الشفرة التي تم إنشاؤها لها لغة محلية غير مستخدمة؟ لا يتسبب ذلك في أي ضرر للشفرة الخاصة بي - باستثناء الحالة التي يتعين علي فيها إيقاف تشغيل noUnusedLocals في tsconfig - وهو ما أفعله الآن.

ماذا عن مثال أقل إثارة للجدل - ماذا لو كانت الشفرة التي تم إنشاؤها لها لغة محلية غير مستخدمة؟ لا يتسبب ذلك في أي ضرر للشفرة الخاصة بي - باستثناء الحالة التي يتعين علي فيها إيقاف تشغيل noUnusedLocals في tsconfig - وهو ما أفعله الآن.

إذا كنت لا تهتم بالشفرة التي تم إنشاؤها ، فيجب أن تكون بتنسيق .js مع رفيق .d.ts. بهذه الطريقة يمكنك التحقق منها ، ولكن لا يتعين عليك تجميعها.

لا يبدو أن المترجم المطبوع على الحروف يحبّ خلطات تسطير أسفل السطر (_) المستخدمة مع السلسلة.

_.mixin () {sortFunciton: sortFunc ()، otherChainFunc: otherFunction ()}

....

someVal = _.chain (بعض صفيف)
.sortFunction ()
.otherChainFunc ()
.القيمة()؛

...

من الأمثلة السهلة جدًا إنشاء مستمع للنقر ، على سبيل المثال باستخدام @HostListener() لـ Angular ، مثل:

@HostListener('click', ['$event'])
onClick(event: MouseEvent) {
    // Code here...
}

إذا قمت بتمكين noUnusedLocals ، يظهر لي الخطأ التالي:

ERROR in ./src (20,13): 'onClick' is declared but never used.

بأي طريقة يمكنني من خلالها ترك المترجم يتجاهل ذلك؟

تضمين التغريدة

_.mixin(){sortFunciton: sortFunc(), otherChainFunc: otherFunction()}

يبدو وكأنه رمز غير صالح.

leocaseiro لماذا يجب أن تكون خاصة؟ في هذه الحالة ، onClick طريقة سينتهي بها المطاف باستخدام الزاوية. تحدث مشكلة مماثلة دائمًا عندما نعلن عن المتغيرات الخاصة التي نستخدمها في القالب. إذا كنت تستخدمها في النموذج ، فما عليك سوى جعل المتغيرات عامة. من المنطقي أنك تركت الزاوية تستخدمها.

مرحبًا @ jmlopez-rod ، أنت على حق.

من المثير للاهتمام أنه للجمهور ، فإنه يمر الآن! انا فعلا اقدر مساعدتك.

leocaseiro public هو مستوى الرؤية الافتراضي لذلك لا تحتاج إلى تحديده.

اعتذر مسبقًا إذا بدت سلبية - ربما فاتني شيء (جديد على TS).
مثال آخر (أنا أستخدم TS فقط لإنتاج ES5 - لا صب ، إعلان ، تفاعل)

// do-as-i-tell-you-start
const factory = () => {
  const _this = [];
  let _value;
  Object.defineProperties(_this, {

    // Error: Property 'getset' does not exist on type 'any[]'.
    // true at at creation but not when used – don't MOM me!
    'method1': { value(){ return _this.getset; } },   

    // Works with property strings – I don't want this
    'method2': { value(){ return _this['getset']; } }, 

    'getset': { get(){ return _value; }, set(value){ _value = value } },
  });
  return _this;
}

صحيح عند الإنشاء ولكن ليس عند الاستخدام - لا أمي!

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

لماذا نحاول التهدئة من TypeScript ، لأي غرض؟

يتعلق الأمر بنقل فريق من ES5 => ES6 (Babel أو TS) => TS في كل مجدها - بخطوات صغيرة.

كان انطباعي أن TS هي إضافة إلى JS تسمح لك بالتدخل إلى أي مستوى أنت فيه.
سبب شكواي هو أن المثال الوهمي المقدم يلقي خطأ وبالتالي _ يفعل
لا تنتج ES5_. لا ينبغي أن يكون الفحص العابر للمنظمة البحرية الدولية إلزاميًا للترجمة.

ما لم يكن لديك أي إصدار عند الخطأ ، فسوف ينبعث. لذلك فهي تنتج ES5.

لم تنجح - تحولت إلى بابل

يمكن تكوين tsc لإرسال المخرجات بغض النظر عن نوع الأخطاء ، انظر إلى الخيار noEmitOnError .

إذا كنت تستخدم ts-loader ، فإنه يحتوي أيضًا على خيار transpileOnly حيث سيتم نقله ببساطة وعدم إظهار أي أخطاء.

trusktr شكرا -

لا تمنع الأخطاء توليد النواتج ولا الأدوات

هذا ليس صحيحا. لدينا إعداد (شائع جدًا - يأتي من بداية) في حزمة الويب والذي يتعطل في بناء الإنتاج ولا ينتج أي شيء. ويجب أن يكون الأمر كذلك - يقوم المترجم بالإبلاغ عن الخطأ (الأخطاء) ، والمبرمج يعود ويصلحها. لماذا نستخدم الأنواع عندما يتجاهلها الفريق بأكمله لأن البناء "يعمل"؟ وبالمثل ، إذا فشل التحويل البرمجي tsc ، فلن يعمل التحديث التلقائي (تتم كتابة المكون الإضافي عمدًا بهذه الطريقة - لا يتم تحديثه إذا كانت شفرتك خاطئة [أو اعتبرها المترجم خاطئًا]).

يعد منع الأخطاء مفيدًا عند وجود خطأ في tsc. على سبيل المثال ، يجب تجميع هذا:

interface A {
  isEmpty(x: any[] | string | object): boolean;
}

const a: A = <A>{};
a.isEmpty({a: 1});

ولكن في إصدار TS الحالي فإنه يفشل.

تحرير: استدعاء وظيفة ثابتة (خط خطأ منسوخ)

بواسطة

a.isEmptyObject ({a: 1}) ؛

أنت تعني

أ.isEmpty ({a: 1}) ؛

؟

نعم بالتأكيد. تم نسخ سطر خاطئ: /.

يعد منع الأخطاء مفيدًا عند وجود خطأ في tsc.

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

لديّ استيراد يبدو كالتالي:

import * as reducers from "./**/reducer.ts"

أستخدم TypeScript أولاً ، ثم Babel. لدي مكوِّن إضافي لـ babel يتعامل مع الواردات * كنمط glob. ألقى TypeScript خطأ يشكو من .ts ، ثم إذا تمت إزالة .ts فلن يتمكن من العثور على الوحدة.

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

lukescott في a .d.ts ضمن نطاق المترجم:

declare module './**/reducer' {
  export = {
    [reducer: string]: () => void; /* or whatever */
  };
}

مثال آخر على مدى فائدة ذلك:

const req = https.request({
        host: 'www.google.com',
        method:'GET',
        path:'/',
        port: 443,
}, (res) => { 
    console.log(res.connection.getPeerCertificate());
});

يقول getPeerCertificate إنه غير موجود بسبب التعريفات الخاطئة في العقدة https ( أيضًا هذا ).

لا يزال يجمع ويعمل مع التسطير الأحمر الكبير ، ولكن سيكون من الجيد جدًا القيام به

console.log(res.connection.getPeerCertificate()); //ts:disable-line

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

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

هذه الميزة المفيدة ستكون مجرد تعميم ! للكائنات الخالية المحتملة.

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

ومع ذلك ، القدرة على إضافة:

سيؤدي إنشاء /*ts-errors-disable*/ إلى بداية ملف المكتبة و /*ts-errors-enable*/ حتى النهاية إلى تقليل ناتج الأخطاء غير ذات الصلة ولكن مع السماح للمطورين بالاحتفاظ بجميع ملفات المصدر بتنسيق TS.

أم يجب أن أفعل الأشياء بشكل مختلف تمامًا؟

benfrain حسنًا ، سيكون من الأفضل تثبيت ملف تعريفات TypeScript المقابل إذا كان موجودًا ( npm install --save-dev @types/mylibrary ) أو إنشاء ملف _.d.ts_ الخاص بك بنوع any إلى مساحة اسم مكتبتك / الدرجة الرئيسية أولا:

// mylibrary.d.ts
declare module "mylibrary" {
    let mylibrary: any;
    export = mylibrary;
}
// main.ts
import mylibrary = require("mylibrary");
...

عندي سؤال. أولاً ، الكود ، والخطأ الذي يميز TypeScript:

import {Directive, ElementRef, Input, OnChanges, SimpleChange} from '@angular/core'

@Directive({
  selector: '[blankAttr]',
})
export class BlankAttr implements OnChanges {
  @Input('blankAttr') private attrName: string // <--- TS Error: unused variable

  constructor(private el: ElementRef) {}

  public ngOnChanges(changes: {[key: string]: SimpleChange}): void {
    const change: any = changes.attrName 
    const prevValue: any = change.previousValue

    if (prevValue) {
      this.el.nativeElement.removeAttribute(prevValue)
    }
    this.el.nativeElement.setAttribute(change.currentValue, '')
  }
}

المشكلة التي أواجهها هي أنني بحاجة إلى إعلان مصمم الديكور @Input للسماح للسمة بتمرير سلسلة. لكني لا أهتم إلا بقيمة تلك السلسلة عندما تتغير. ويمكنني الحصول على القيمة السابقة والحالية عند التعامل مع حدث التغيير.

هل يمكننا الحصول على // ts-ignore الآن؟ أم أن هناك طريقة أخرى لحل هذا بشكل جيد؟

uglow لماذا يكون attrName خاصًا؟ هذا متغير يعدله Angular بحيث يمكنك الحصول على قيمة به. وبالتالي ، يجب أن تكون عامة.

@ jmlopez-rod لقد غيرتها إلى عامة ، لكن هذا لا يغير المشكلة. يقول TS أنه متغير غير مستخدم.

أنا أستخدم TS 2.4.1 ، بعد أن جعله الطباعة العامة تتوقف عن إصدار الخطأ.

قبل:
screen shot 2017-07-26 at 9 53 13 am

بعد، بعدما:
screen shot 2017-07-26 at 9 53 39 am

أنا أستخدم 2.3.3. سأحاول 2.4.1. شكرا 😊

يجب تضمين هذا. أنا أعمل باستخدام محرك js مخصص يسمح لملف .js واحد بإرجاع قيمة. انظر الى جوهر بلدي على سبيل المثال . أستخدم TS لإنشاء ملفات .js الخاصة بي وبالطبع لا يعرف TS عن ذلك ويرمي:

A 'return' statement can only be used within a function body.

mhegazy لقد

وضعي الحالي (يفترض التدفق بأكمله وضع الإعلان):

  • يطلب مصممو الفصل إعلانًا عن الفصل (وليس تعبيرًا عن الفصل) وأنا داخل وظيفة - من حيث المبدأ يمكن إصلاح هذا ، لكنه ليس كذلك اليوم.
  • حسنًا ، لا مشكلة سأجعل التعبير إعلانًا
  • لا نرد ، الإعلان الآن له اسم غير مستخدم
  • حسنًا ، لا مشكلة سأعيدها
  • لا نرد ، Return type of public method from exported class has or is using private name
  • ...؟

السبب الأساسي هنا هو أن التعبيرات لا يمكن تزيينها ، لكن من غير المعقول أن تتخلى عن كل شيء لتنفيذ هذه الوظيفة. في غضون ذلك ، من المنطقي بالنسبة لي ببساطة قمع هذا الخطأ. سأكون على ما يرام إذا كان قمع الخطأ يتطلب مني العثور على مشكلة TypeScript المرتبطة وأقول شيئًا مثل // TS-LIMITATION:#9448 على الرغم من أنني أشك في أن ذلك سيؤدي إلى قدر كبير من المشكلات الجديدة التي لا طائل من ورائها من وجهة نظرك.

سأكون على ما يرام إذا أضفت عمليات قمع مستهدفة محددة للمشكلات المعروفة التي لست مستعدًا لتقبلها بعد ، ولكن فقط إذا تم ذلك بسرعة ودون بذل الكثير من الجهد في التصميم (من شأن ذلك أن يجعل الآلية بلا جدوى: wink:)

لا أرغب في تلقي خطأ رمز لا يمكن الوصول إليه (حيث يسعدني أن أعلق توضيحيًا على "اخرس لخطأ رمز لا يمكن الوصول إليه هنا") عندما أفعل شيئًا مثل
if (false){ ...complicated debug code that I dont want to delete/forget... }

لذلك ، لا يزال برنامج التحويل البرمجي TypeScript يفتقد إلى خيار "إيقاف تشغيل الأدوات الأخرى وعدم إفسادها". سيكون من المفيد حقًا أن يكون لدينا هذا الخيار عبر التعليقات وعبر مفاتيح التحويل البرمجي لملفات معينة أو حتى glob. نحن عالقون في استخدام الإصدار القديم من الأدوات لأننا لا نريد أن نفقد إعادة التحميل التلقائي (لا يتم إعادة التحميل التلقائي للإصدارات الأحدث عند وجود أخطاء). لذلك إما أن نقوم بإيقاف تشغيل خيار عربات التي تجرها الدواب noImplicitAny (وهو ما لا أريده حقًا ، فأنا أستخدم TypeScript بسبب فحص الكتابة ومع السماح الضمني بأي نوع TypeScript لا يجلب الكثير إلى الجدول) أو البقاء على الإصدارات القديمة من الحزم. نعم، أنا ذكرت علة في كليهما، WebPack و AwesomeTypeScript محمل، ولكن لا أحد يهتم. يتم تجاهل هذه القضية لعدة أشهر حتى الآن. أرى أنه هو نفسه تمامًا مع حزمة TypeScript :-(.

polyglotinc if (!!false) {

RyanCavanaugh حسنًا ، لهذا الأمر ، (!true) يعمل ... لم أفكر في هذه كاحتمالات لأنني _ (بصفتي كاتب مترجم سابق) _ أعطيت المترجم المزيد من الفضل فيما يتعلق بالثابت / الحرفي انهيار التعبير ... أعتقد أنني اكتشفت أنه سيكون جسمًا مشغولًا بحوالي if (false) ، فسيعرف أن if (!true) هو نفس الشيء!

unional يمكن كتابة سؤال SO بشكل أوضح قليلاً وربما لهذا السبب نحتاج إلى المترجم ليخبرنا عن الأخطاء المحتملة. شاهد لقطة الشاشة هذه التي توضح الخطأ الذي يريد المستخدم منعه

screen shot 2017-08-09 at 12 43 20 am

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

private keyHandlers = {
    'ArrowDown': function ($event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

يدعي المستخدم أنه يتم استخدام handleArrow* لكن الكتابة المطبوعة لا ترى أنه قيد الاستخدام. بقدر ما يتعلق الأمر بالطباعة ، يمكن أن يكون this في this.handleArrowDown($event); أي كائن له الطريقة handleArrowDown . من خلال وظيفة السهم ، أصبح يعرف الآن أن this هو مثيل الفئة وبالتالي يرى handleArrowUp قيد الاستخدام.

خيار آخر: استخدم المعامل الأول الزائف this .

  private keyHandlers = {
    'ArrowDown': function (this: SomeComponent, $event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

@ jmlopez-رود شكرا. هذه بديل جيد. يعجبني بشكل خاص الحل function(this: SomeComponent, ...) {...} لأنه الأكثر مرونة.

لا تعمل وظيفة السهم إذا لم تكن keyHandlers جزءًا من الفصل الدراسي:

const keyHandlers = {
  'ArrowDown': function (this: SomeComponent, $event) {
    this.handleArrowDown($event); // error on accessing private method, filing an issue for it.
  },

  'ArrowUp': ($event) => { // doesn't work, duh
    this.handleArrowUp($event);
  }
}

export class SomeComponent {
  onKeyDown($event) {
    if (typeof keyHandlers[$event.code] === 'function') {
      keyHandlers[$event.code]($event);
    }
  }
  private handleArrowDown(_event) {
    // ...
  }

  private handleArrowUp(_event) {
    // ...
  }
}

من ناحية أخرى ، فإن وظيفة السهم هي الأكثر مباشرة إلى الأمام في هذا السياق.

أحاول تعيين window.console يدويًا لـ IE9 لمنع حدوث أخطاء عند استخدام console.log :

if (!window.console)
    window.console = {};

لكني أحصل على error TS2540: Cannot assign to 'console' because it is a constant or a read-only property. هل هناك أي حل بديل لحالات الاستخدام هذه؟

amiraliakbari يمكنك تأكيد window أنه any النوع ، مما يتيح لك فعليًا إلغاء الاشتراك في عمليات التحقق من النوع:

(window as any).console = {};

لقد نجح هذا في تجاوز / تعطيل console.log عالميًا - لاحظ أنه تم تحديد Project.logging قبل هذا

(window.console as any).___real_log = window.console.log;
window.console.log = function(args) {
  if (Project.logging) return (window.console as any).___real_log(args);
  return;
};

كان هذا أيضًا أكثر نظافة من وضع كشوفات حساب if جميع أنحاء الكود الخاص بي حيث يمكنني فقط استخدام console.log كالمعتاد

كما هو مذكور في # 19109 ما زلنا لا نملك القدرة على قمع خطأ معين .

كما هو مذكور في # 19109 ما زلنا لا نملك القدرة على قمع خطأ معين.

أعتقد أنه تم تناول السيناريو الأساسي الموضح في هذه المسألة. يمكننا إنشاء مشكلة جديدة لتتبع قمع الخطأ العالمي باستخدام رقم الخطأ. لقد كنا مترددين في استخدام رموز الخطأ بهذه الطريقة لأنها تفتقر إلى التعبير.

تم إنشاؤه # 19139.

هذه التعليمات تعمل فقط لكل ملف ، أليس كذلك؟ هل من الممكن جعله يعمل على المجلد؟

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

لماذا أغلقت هذه القضية؟ لا يزال الحل مفقودًا! لماذا لديك مناقشات لا معنى لها لمدة عامين بدلاً من الدمج واحتمال مناسب لقمع الأخطاء؟

@ webia1 ربما تكون مهتمًا بـ # 19139 الذي لا يزال مفتوحًا.

(إضافة هذا التعليق هنا فقد يكون مفيداً لمن يتعثر في هذه القضية كما فعلت أنا)

جريت عبر https://github.com/Microsoft/TypeScript/pull/21602 وقد يكون هذا هو الحل.

فقط أضف // @ts-ignore إلى الكود الخاص بك (أو حتى // @ts-ignore <some code error> لتجاهل الخطأ المحدد فقط) .

اختبرته هنا باستخدام TypeScript 2.7.2 وهو يعمل!

(أو حتى // @ ts-ignoreلتجاهل الخطأ المحدد فقط).

لم يتم دمج 21602. لا يمكنك تجاهل بعض الأخطاء فقط.

RyanCavanaugh أنت على حق! لقد قمت بتحديث تعليقي. شكرا!

وصل إلى هنا يبحث عن خطأ TS2339.

document.getElementById('theme-admin').disabled = false; /* tslint:disable */
document.getElementById('theme-member').disabled = true; /* tslint:disable */
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات