Игнорировать определенные ошибки компиляции TypeScript?

Мне интересно, есть ли способ игнорировать определенные ошибки TypeScript при компиляции?

У меня в основном те же проблемы, которые возникают у большинства людей с большими проектами при использовании ключевого слова this, и я не хочу помещать все методы моих классов в конструктор.

Итак, у меня есть такой пример:

машинописи Пример

Кажется, что это создает совершенно правильный JS и позволяет мне обойти проблему с ключевым словом this, однако, как вы можете видеть в примере, компилятор машинописного текста сообщает мне, что я не могу скомпилировать этот код в качестве ключевого слова, это не действительно в этой области. Однако я не понимаю, почему это ошибка, поскольку он дает нормальный код.

Так есть ли способ заставить его игнорировать определенные ошибки? Я уверен, что со временем появится хороший способ управлять ключевым словом this, но в настоящее время я считаю его довольно ужасным.

== Редактировать ==

(Не читайте, если вас не интересует контекст этого вопроса и частичная напыщенная речь)

Просто чтобы добавить контекст ко всему этому, чтобы показать, что я не просто чокнутый (я уверен, что многие из вас все еще будут так думать) и что у меня есть несколько веских причин, по которым я хочу иметь возможность разрешить это. ошибки, которые нужно пройти.

Вот несколько предыдущих вопросов, которые я задал, которые подчеркивают некоторые основные проблемы (imo) с текущей этой реализацией TypeScript.

Использование шезлонга с Typescript

Проблема с дочерней областью видимости этого в Typescript

https://typescript.codeplex.com/discussions/429350 (и некоторые комментарии, которые я делаю дно)

Основная проблема, с которой я столкнулся, заключается в том, что мне нужно гарантировать, что вся логика находится в согласованной области, мне нужно иметь доступ к вещам в пределах knockout, jQuery и т. Д. И локального экземпляра класса. Раньше я делал это с var self = this; в объявлении класса в JavaScript и отлично работал. Как упоминалось в некоторых из этих предыдущих вопросов, я не могу этого сделать сейчас, поэтому единственный способ гарантировать область видимости - это использовать лямбда-методы, и единственный способ определить один из них как метод внутри класса - внутри конструктора, и эта часть ТЯЖЕЛА зависит от личных предпочтений, но я нахожу ужасным то, что люди, кажется, думают, что использование этого синтаксиса классифицируется как рекомендуемый шаблон, а не просто обходной путь.

Я знаю, что TypeScript находится в альфа-фазе, и многое изменится, и я очень надеюсь, что мы получим более приятный способ справиться с этим, но в настоящее время я либо делаю все огромным беспорядком, чтобы заставить машинописный текст работать ( и это в пределах Сотни файлов, которые я перехожу на TypeScript), или я просто делаю вызов, который я знаю лучше, чем компилятор в этом случае (ОЧЕНЬ ОПАСНО, Я ЗНАЮ), чтобы я мог сохранить свой код красивым и, надеюсь, когда лучше шаблон выходит для обработки этого, я могу перенести его тогда.

Кроме того, я знаю, что многим людям нравится тот факт, что TypeScript охватывает и пытается оставаться как можно ближе к новым функциям JavaScript и известному синтаксису, что прекрасно, но машинописный текст НЕ является следующей версией JavaScript, поэтому Я не вижу проблем с добавлением синтаксического сахара в язык, поскольку люди, которые хотят использовать последнюю и лучшую официальную реализацию JavaScript, все еще могут это сделать.


person Grofit    schedule 15.04.2013    source источник
comment
Почему вы хотите писать с этим синтаксисом вместо обычного синтаксиса функции? Связанный код требует довольно серьезных компромиссов с точки зрения производительности / памяти; было бы хорошо понять почему.   -  person Ryan Cavanaugh    schedule 15.04.2013
comment
Я внесу правку, чтобы дать этому контексту, мне не нравятся объявления методов в конструкторе, и из-за Knockout, Jquery, Lawnchair и других библиотек я использую возня с контекстом this везде, где я должен поместить почти каждый метод в конструкторе, чтобы иметь возможность получить доступ к экземпляру this из класса, ОДНАКО мне очень не нравится этот подход и я хочу иметь возможность просто получить доступ к экземпляру this вне конструктора. Поскольку обычный синтаксис объявления метода public someMethod(): string { return "hello"; } не гарантирует контекст this, в отличие от лямбда-выражений.   -  person Grofit    schedule 15.04.2013
comment
TypeScript больше не жалуется на ваше решение. :)   -  person Kyle    schedule 04.02.2020
comment
Связанный пример в настоящее время относится к игровой площадке машинописного текста по умолчанию. Может кто-нибудь поправить ссылку, чтобы правильно загрузить код?   -  person Sean McMillan    schedule 29.06.2021
comment
@SeanMcMillan Я исправил для вас ссылку   -  person Grofit    schedule 22.07.2021


Ответы (3)


Конкретная проблема автора с this кажется решенной, но возникает вопрос об игнорировании ошибок и для тех, кто попадает сюда и ищет, как игнорировать ошибки:

Если правильно исправить ошибку или использовать более достойные обходные пути, подобные уже предложенным здесь, не вариант, начиная с TypeScript 2.6 (выпущенного 31 октября 2017 г.), теперь существует способ игнорировать все ошибки из определенного строка, используя // @ts-ignore комментарии перед целевой строкой.

Исправленная документация достаточно лаконична, но резюмирую:

// @ts-ignore
const s : string = false

отключает отчеты об ошибках для этой строки.

Однако это следует использовать только в крайнем случае, когда исправление ошибки или использование таких хаков, как (x as any), гораздо сложнее, чем потеря всей проверки типов для строки.

Что касается указания определенных ошибок, текущее состояние (середина 2018 г.) обсуждается здесь, в Примечаниях к совещанию разработчиков ( 16.02.2018) и дальнейшие комментарии, что в основном

"без вывода пока"

и сильное сопротивление введению этой тонкой настройки.

person stsloth    schedule 11.08.2018
comment
Как уже упоминалось, TS значительно изменился с тех пор, как был опубликован этот вопрос, и хотя мы все стали немного мудрее, если кто-то пойдет сюда, ожидая найти, как игнорировать ошибки, это ответ. - person Grofit; 13.08.2018

Я думаю, что ваш вопрос в том виде, в каком он задан, является проблемой XY. Вы собираетесь как я могу гарантировать, что некоторые из моих методов класса гарантированно будут иметь правильный this контекст?

Для этой проблемы я бы предложил следующее решение:

class LambdaMethods {
    constructor(private message: string) {
        this.DoSomething = this.DoSomething.bind(this);
    }

    public DoSomething() {
        alert(this.message);
    }
}

Это дает несколько преимуществ.

Во-первых, вы открыто говорите о том, что происходит. Большинство программистов, вероятно, не поймут тонкую семантику того, в чем разница между синтаксисом члена и метода с точки зрения генерации кода.

Во-вторых, он очень ясно дает понять, глядя на конструктор, какие методы будут иметь гарантированный this контекст. Критически важно, с точки зрения производительности, вы не хотите писать так все свои методы, а только те, которые в этом абсолютно необходимы.

Наконец, он сохраняет семантику ООП класса. Фактически вы сможете использовать super.DoSomething из реализации производного класса DoSomething.

person Ryan Cavanaugh    schedule 15.04.2013
comment
что делает метод bind? Я предполагаю, что это подразумевает контекст this, но я никогда раньше не видел ссылки на него ... если я могу организовать область видимости на уровне конструктора, но определить методы на уровне класса, тогда я доволен этим компромиссом. - person Grofit; 15.04.2013
comment
comment
Узнавайте что-то новое каждый день! - person Grofit; 15.04.2013
comment
Это круто, не знал, что это было реализовано для нас, браво - person N. Taylor Mullen; 16.04.2013
comment
Кстати, я уже задавал вопрос, который вы упомянули в проблеме XY ранее, разным людям на форумах, irc и т.д., однако никто не смог дать мне ответа, кроме как поместить объявления методов в ваш конструктор, так что это оставило меня с возможность просто обмануть Typescript для вывода нужного мне кода, поэтому, хотя это случай XY, не похоже, что я раньше не пытался получить прямой ответ, поэтому у меня закончились варианты, если я хотел продолжить использовать TS .. Я просто хочу, чтобы эта информация была где-то еще, чтобы другие могли видеть ВСЕ возможные способы управления этим в TS. - person Grofit; 16.04.2013

Я уверен, что вам известна стандартная форма определения функции без обозначения стрелок. Есть еще одно выражение TypeScript, которое генерирует точно такой же код, но без ошибки компиляции:

class LambdaMethods {
    private message: string;
    public DoSomething: () => void;

    constructor(message: string) {
        this.message = message;
        this.DoSomething = () => { alert(this.message); };
    }
}

Так почему это законно, а другое - нет? Хорошо по спецификации: an arrow function expression preserves the this of its enclosing context. Таким образом, он сохраняет значение this из объявленной области. Но объявление функции на уровне класса this на самом деле не имеет смысла.

Вот пример, который неверен по той же причине, которая может быть более ясной:

class LambdaMethods {
    private message: string;

    constructor(message: string) {
        this.message = message;
    }

    var a = this.message;  // can't do this
}

То, как инициализатор работает в сочетании с конструктором, является деталью реализации, на которую нельзя полагаться. Это могло измениться.

Я уверен, что со временем появится хороший способ управлять этим ключевым словом, но в настоящее время я считаю это довольно ужасным.

Одна из высокоуровневых целей (которую я люблю) в TypeScript - это расширение языка JavaScript и работа с ним, а не борьба с ним. Как работает this, сложно, но стоит изучить.

person Jeffery Grajkowski    schedule 15.04.2013
comment
Мне не нравится (и это хорошо) необходимость помещать объявления моих методов в конструктор. Учитывая, что у меня есть документация по стилю xml вокруг моего кода, и у меня есть несколько классов моделей большого представления, поэтому в данный момент это просто ужасный беспорядок. Поэтому я не хочу продолжать этот путь с Typescript, если я не смогу хотя бы сделать код более управляемым (поскольку я все равно работаю над веткой). Что касается последнего пункта, я ТОЧНО знаю, как this работает в Javascript (см. Мои правки по предыдущим вопросам о лучших способах использования этого в Typescript), мне просто не нравится, как это используется в TS. - person Grofit; 15.04.2013
comment
Так что же плохого в стандартной функции, в которой не используются стрелки? - person Jeffery Grajkowski; 15.04.2013
comment
Это не гарантирует контекст this, и, как упоминалось в редакции, мне нужно иметь согласованный объем этого. - person Grofit; 15.04.2013