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



в VS2013 здание останавливается, когда tsc выходит с кодом 1. Это было не так в VS2012.



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



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

785   9  

9 ответов:

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

проблема заключается в отсутствии машинописного текста:

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();

Edit, конец 2016

так как TypeScript 1.6 предпочтительным оператором литья является as те линии могут быть squqshed в элегантный:

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


других решений

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

  1. создать собственный интерфейс, который просто расширяет HTMLElement
  2. ввести собственный тип, который расширяет 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

    Ничего не найдено.