Игнорировать ошибки Typescript " свойство не существует на значение типа"
в VS2013 здание останавливается, когда tsc выходит с кодом 1. Это было не так в VS2012.
Как я могу запустить свое решение с игнорированием tsc.ошибку?
Я получаю много The property 'x' does not exist on value of type 'y' ошибки, которые я хочу игнорировать при использовании функций javascript.
9 ответов:
Я знаю, что вопрос уже закрыт, но я нашел его в поисках того же TypeScriptException, может быть, кто-то еще ударил этот вопрос в поисках этой проблемы.
проблема заключается в отсутствии машинописного текста:var coordinates = outerElement[0].getBBox();закидываем
The property 'getBBox' does not exist on value of type 'HTMLElement'.
Самый простой способ-явно ввести переменную какanyvar outerHtmlElement: any = outerElement[0]; var coordinates = outerHtmlElement.getBBox();Edit, конец 2016
так как TypeScript 1.6 предпочтительным оператором литья является
asте линии могут быть squqshed в элегантный:
let coordinates = (outerElement[0] as any).getBBox();
других решений
конечно, если вы хотите сделать это правильно, что иногда перебор, можно:
- создать собственный интерфейс, который просто расширяет
HTMLElement- ввести собственный тип, который расширяет
HTMLElement
быстрое и грязное решение заключается в явном приведении к
any(y as any).x"преимущество" заключается в том, что при явном приведении это будет компилироваться даже с
noImplicitAnyустановить флаг.правильное решение-обновить файл определения типов.
обратите внимание, что при применении переменной
any, вы отказаться проверки типа переменной.
так как я нахожусь в режиме отказа от ответственности, двойной кастинг через
anyв сочетании с новым интерфейсом, может быть полезно в ситуациях, когда вы
- не хочу обновлять сломанный файл typings
- обезьяны латают
тем не менее, вы все еще хотите какую-то форму ввода.
скажем, вы хотите исправить определение экземпляра
yтипаOrginalDefС новой администрациейxтипаnumber:const y: OriginalDef = ... interface DefWithNewProperties extends OriginalDef { x: number } const patched = y as any as DefWithNewProperties patched.x = .... //will compile
вы также можете использовать следующий трюк:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errorsобратите внимание, что доступ к
xи не получить ошибку машинописного текста снова вам нужно написать это такy["x"], а неy.x. Так что с этой точки зрения другие варианты лучше.
есть несколько способов решить эту проблему. Если этот объект связан с какой-то внешней библиотекой, лучшим решением было бы найти фактический файл определений (great repository здесь) для этой библиотеки и ссылки на нее, например:
/// <reference path="/path/to/jquery.d.ts" >конечно, это не применимо во многих случаях.
Если вы хотите "переопределить" систему типов, попробуйте следующее:
declare var y;Это позволит вам делать любые звонки, которые вы хотите на
var y.
когда TypeScript думает, что свойство "x" не существует "y", то вы всегда можете бросить "y "в" любой", что позволит вам называть что-либо (например," x") на"y".
теория
(<any>y).x;Реальный Пример
Я получаю сообщение об ошибке "TS2339: свойство 'name' не существует на типе 'Function '" для этого кода:
let name: string = this.constructor.name;Так что я исправил его с:
let name: string = (<any>this).constructor.name;
была проблема в Angular2, я использовал локальное хранилище, чтобы сохранить что-то, и это не позволило мне.
решения:
Я
localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.Как это исправить:
localStorage ['city']
(localStorage).город
(объект localStorage как есть).город
быстрое исправление, где больше ничего не работает:
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
в моем конкретном проекте, я не мог заставить его работать, и использовать
declare var $;. не чистое / рекомендуемое решение, он не распознает переменные JQuery, но у меня не было ошибок после использования этого (и пришлось для моих автоматических сборок добиться успеха).
я смог пройти мимо этого в 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 и компиляции.
Comments