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

129

В 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.

Теги:
visual-studio-2013

9 ответов

204
Лучший ответ

Я знаю, что вопрос уже закрыт, но я обнаружил, что он ищет тот же 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
  • 9
    Вы также можете создать интерфейс, который расширяет HTMLElement и имеет дополнительное свойство getBBox . Таким образом, вы по-прежнему получаете завершение кода для других свойств.
  • 0
    вместо приведения в любой getBBox существует ли какой-либо метод приведения в порядке? хотели бы узнать тип getBBox ?
Показать ещё 6 комментариев
89

Быстрое и грязное решение заключается в явном нажатии на 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
  • 0
    Спасибо, это помогло: import http = require ('http'); var server = http как любой; server.Server (приложение); // игнорирует ошибки ts!
  • 0
    Я использовал это в "убедиться, что свойство не найдено в NodeRequire". поэтому я объявил свою переменную require в NodeRequired и (require как any) .ensure для свойства. Надеюсь это поможет.
50

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

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

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

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

  • 2
    Кто-нибудь знает, почему это работает, и имеет ли это какие-либо потенциальные последствия или преимущества по сравнению с первоначальным объявлением объекта как :any ?
35

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

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

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

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

declare var y;

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

  • 5
    Должно быть /// <reference path="/path/to/jquery.d.ts" /> с самозакрывающимся тегом в конце
  • 0
    Я использую VS2015 и следовал этому руководству для угловых у меня нет файла jquery.d.ts в моем проекте
Показать ещё 3 комментария
13

Когда 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;
  • 1
    Не работает с супер. Если вы расширяете класс, используя типизацию, а автор забывает публичный метод, вы в значительной степени облажались. Вы должны добавить его в определение типа, которое останавливается при следующей установке npm, вынуждая вас создавать запрос на извлечение или иным образом уведомлять автора, что, вероятно, хорошо, но неприятно.
9

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

Решения:

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

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

LocalStorage [ 'город']

(LocalStorage).city

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

  • 0
    Второй вариант выглядит круто, но, похоже, больше не справляется с работой. Работает, если вы ставите перед объектом префикс <any> - (<any>localStorage).city .
1

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

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

  • 0
    Я тоже так делаю, но некоторые платформы (например, Google Cloud) выдают предупреждающее сообщение о том, что ab лучше, чем ['b']. Вы знаете, почему это так?
  • 1
    Не уверен, но вы можете, например, в tslint.json изменить параметры так, чтобы они предпочитали
0

Мне удалось пропустить это в 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 и скомпилировать.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню