Игнорировать ошибки Typescript "свойство не существует для значения типа"

В VS2013 здание останавливается, когда TSC завершает работу с кодом 1. Этого не было в VS2012.

Как я могу запустить свое решение, игнорируя ошибку tsc.exe?

Я получаю много The property 'x' does not exist on value of type 'y' ошибок The property 'x' does not exist on value of type 'y', которые я хочу игнорировать при использовании функций javascript.

Ответ 1

Я знаю, что вопрос уже закрыт, но я обнаружил, что он ищет тот же TypeScriptException, может быть, кто-то еще столкнется с этим вопросом, ища эту проблему.

Проблема заключается в отсутствии TypeScript ввода:

var coordinates = outerElement[0].getBBox();

Броски The property 'getBBox' does not exist on value of type 'HTMLElement'.


Самый простой способ - явно ввести переменную как any

var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();

Изменить, конец 2016 года

Так как TypeScript 1,6 предпочтительный оператор литья as, эти строки могут быть отброшены в элегантные:

let coordinates = (outerElement[0] as any).getBBox();


Другие решения

Конечно, если вы хотите сделать это правильно, что иногда является чрезмерным, вы можете:

  • Создайте собственный интерфейс, который просто расширяет HTMLElement
  • Введите собственный текст, который расширяет HTMLElement

Ответ 2

Быстрое и грязное решение заключается в явном нажатии на any

(y as any).x

"Преимущество" состоит в том, что при явном произнесении это будет скомпилировано даже с установленным флагом noImplicitAny.

Правильное решение - обновить файл определения типизации.

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


Поскольку я в режиме отказа от ответственности, двойное кастинг через any в сочетании с новым интерфейсом может быть полезным в ситуациях, когда вы

  • не хотят обновлять файл с разбитыми файлами
  • - патч обезьяны

тем не менее, вам все равно нужна форма ввода.

Предположим, вы хотите исправить определение экземпляра y типа OrginalDef новым свойством x типа number:

const y: OriginalDef = ...

interface DefWithNewProperties extends OriginalDef {
    x: number
}

const patched = y as any as DefWithNewProperties

patched.x = ....   //will compile

Ответ 3

Вы также можете использовать следующий трюк:

y.x = "some custom property"//gives typescript error

y["x"] = "some custom property"//no errors

Обратите внимание, что для доступа к x и не возвращайте ошибку typescript, вам нужно записать ее так: y["x"], а не y.x. Таким образом, с этой точки зрения другие варианты лучше.

Ответ 4

Существует несколько способов решения этой проблемы. Если этот объект связан с некоторой внешней библиотекой, лучшим решением было бы найти фактический файл определений (отличный репозиторий здесь) для этой библиотеки и ссылки это, например:

/// <reference path="/path/to/jquery.d.ts" >

Конечно, во многих случаях это не применяется.

Если вы хотите "переопределить" систему типов, попробуйте следующее:

declare var y;

Это позволит вам делать любые вызовы, которые вы хотите на var y.

Ответ 5

Когда TypeScript думает, что свойство "x" не существует на "y" , вы всегда можете перевести "y" в "any", что будет позвольте вам называть что угодно (например, "x" ) на "y" .

Теория

(<any>y).x;

Пример реального мира

Я получал ошибку "TS2339: свойство" name "не существует в типе" Функция "для этого кода:

let name: string = this.constructor.name;

Поэтому я исправил его с помощью

let name: string = (<any>this).constructor.name;

Ответ 6

Если в Angular2 возникла проблема, я использовал локальное хранилище, чтобы что-то сохранить, и это не позволило мне.

Решения:

У меня было localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

Как это исправить:

LocalStorage [ 'город']

(LocalStorage).city

(localStorage как любой).city

Ответ 7

Быстрое исправление, где больше ничего не работает:

const a.b = 5 // error

const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled

const B = 'b'
const a[B] = 5 // always works

Не очень хорошая практика, но предоставляет решение без необходимости выключать no-string-literal

Ответ 8

В моем конкретном проекте я не мог заставить его работать и использовал declare var $;. Не чистое/рекомендуемое решение,, оно не распознает переменные JQuery, но после этого у меня не было ошибок (и мне приходилось выполнять автоматические сборки).

Ответ 9

Мне удалось пропустить это в typescript, используя что-то вроде:

let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
    y.set(x[i], //value for this key here);
}

Казалось, это единственный способ использовать значения внутри X как ключи для карты Y и скомпилировать.