В 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.
Я знаю, что вопрос уже закрыт, но я обнаружил, что он ищет тот же 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();
Так как TypeScript 1,6 предпочтительный оператор литья as
, эти строки могут быть отброшены в элегантные:
let coordinates = (outerElement[0] as any).getBBox();
Конечно, если вы хотите сделать это правильно, что иногда является чрезмерным, вы можете:
HTMLElement
HTMLElement
Быстрое и грязное решение заключается в явном нажатии на 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
Вы также можете использовать следующий трюк:
y.x = "some custom property"//gives typescript error
y["x"] = "some custom property"//no errors
Обратите внимание, что для доступа к x
и не возвращайте ошибку typescript, вам нужно записать ее так: y["x"]
, а не y.x
. Таким образом, с этой точки зрения другие варианты лучше.
:any
?
Существует несколько способов решения этой проблемы. Если этот объект связан с некоторой внешней библиотекой, лучшим решением было бы найти фактический файл определений (отличный репозиторий здесь) для этой библиотеки и ссылки это, например:
/// <reference path="/path/to/jquery.d.ts" >
Конечно, во многих случаях это не применяется.
Если вы хотите "переопределить" систему типов, попробуйте следующее:
declare var y;
Это позволит вам делать любые вызовы, которые вы хотите на var y
.
/// <reference path="/path/to/jquery.d.ts" />
с самозакрывающимся тегом в конце
jquery.d.ts
в моем проекте
Когда 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;
Если в Angular2 возникла проблема, я использовал локальное хранилище, чтобы что-то сохранить, и это не позволило мне.
Решения:
У меня было localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
Как это исправить:
LocalStorage [ 'город']
(LocalStorage).city
(localStorage как любой).city
<any>
- (<any>localStorage).city
.
Быстрое исправление, где больше ничего не работает:
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
Мне удалось пропустить это в 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 и скомпилировать.
В моем конкретном проекте я не мог заставить его работать и использовал declare var $;
. Не чистое/рекомендуемое решение,, оно не распознает переменные JQuery, но после этого у меня не было ошибок (и мне приходилось выполнять автоматические сборки).
HTMLElement
и имеет дополнительное свойствоgetBBox
. Таким образом, вы по-прежнему получаете завершение кода для других свойств.getBBox
существует ли какой-либо метод приведения в порядке? хотели бы узнать типgetBBox
?