Typescript 오류 무시 "유형 값에 속성이 없습니다"


227

VS2013에서 tsc가 코드 1로 종료되면 빌드가 중지됩니다. VS2012에서는 그렇지 않았습니다.

tsc.exe 오류를 무시하면서 어떻게 솔루션을 실행할 수 있습니까?

The property 'x' does not exist on value of type 'y'자바 스크립트 함수를 사용할 때 무시하고 싶은 많은 오류가 발생합니다.

답변:


303

질문이 이미 닫 혔음을 알고 있지만 동일한 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();


다른 솔루션

물론 때로는 과잉 인 올바른 작업을 원한다면 다음을 수행 할 수 있습니다.

  1. 단순히 확장되는 자체 인터페이스 만들기 HTMLElement
  2. 자신 만의 타이핑을 소개합니다 HTMLElement

14
확장 HTMLElement하고 추가 getBBox속성 이 있는 인터페이스를 만들 수도 있습니다 . 이렇게하면 다른 속성에서 코드를 완성 할 수 있습니다.
thetallweeks

에 캐스팅하는 대신 getBBox적절하게 캐스팅하는 방법이 있습니까? 유형을 찾고 싶습니다 getBBox?
Pardeep Jain은

FE : 경우 getBBox에있을 것 HTMLElement유형이하여에 개체를 캐스팅 수 있습니다 var typedElement = <HTMLElement> outerHtmlElement;.
michalczukm

4
좋은! var coordinates = (<any>outerElement[0]).getBBox();
bowpunya

1
이것은 실제로 질문에 대답하지 않습니다 "어떻게 오류를 무시하기를"
Petr Peller

121

빠르고 더러운 해결책은 명시 적으로 캐스팅하는 것입니다. 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

덕분에 도움이되었습니다. import http = require ( 'http'); var server = http; server.Server (앱); // TS 오류를 무시합니다!
풍경

"NodeRequire에서 속성을 찾을 수 없음"에서 이것을 사용했습니다. 그래서 NodeRequired에 require 변수를 선언하고 (필요한 경우) 속성을 확인하십시오. 도움이 되었기를 바랍니다.
Juni Brosas

61

다음과 같은 트릭을 사용할 수도 있습니다.

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

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

액세스 x하고 typescript 오류를 다시 얻지 않으려면 y["x"], not 으로 작성해야합니다 y.x. 따라서이 관점에서 다른 옵션이 더 좋습니다.


4
왜 이것이 작동하는지, 이것이 처음에 객체를 다음과 같이 선언하는 것보다 잠재적 인 영향이나 이점이 있는지 알고 :any있습니까?
mcheah

타이핑을 유지하는 대신 타이핑을 유지하면 확실한 이점이 있습니다. 왜 이것이 경고를
내리지

38

이 문제를 처리하는 방법에는 여러 가지가 있습니다. 이 객체가 일부 외부 라이브러리와 관련이있는 경우 가장 좋은 해결책은 해당 라이브러리에 대한 실제 정의 파일 (큰 저장소 here ) 을 찾아서 참조하는 것입니다. 예 :

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

물론 이것은 많은 경우에 적용되지 않습니다.

유형 시스템을 '재정의'하려면 다음을 시도하십시오.

declare var y;

이렇게하면 원하는 전화를 걸 수 있습니다 var y.


5
/// <reference path="/path/to/jquery.d.ts" />마지막에 자체 닫는 태그가 있어야 함
tic

VS2015를 사용하고 있으며 각도에 대한 튜토리얼을 따랐 jquery.d.ts습니다. 프로젝트에 파일 이 없습니다
Dimple

@Dimple npm install -g tsd그때tsd install jquery
Akash

두 번째 옵션 (var y 선언)은 JavaScript에서 TypeScript로 마이그레이션하고 이전 JavaScript가 다른 JavaScript 파일의 변수를 참조하므로 오류 TS2304를 방지하려는 경우 효과적입니다.
yesman

감사! 저에게 문제는 Jest, const mockPrompt와 관련이 있습니다. any = jest.spyOn (step, 'prompt');
Mark Robson

18

TypeScript가 "y""x" 속성 이 존재하지 않는다고 생각하면 "y"를 "any"로 캐스트 할 수 있으므로 "y"에서 "x"와 같은 것을 호출 할 수 있습니다.

이론

(<any>y).x;

실제 예

이 코드에 대한 "TS2339 : 'name'속성이 'Function'유형에 없습니다. '오류가 발생했습니다.

let name: string = this.constructor.name;

그래서 나는 그것을 고쳤다.

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

1
슈퍼와 함께 작동하지 않습니다. 타이핑을 사용하여 수업을 확장하고 저자가 공개 방법을 잊어 버린다면 거의 망할 수 있습니다. 다음 npm 설치시 중지되는 유형 정의에 추가해야하므로 끌어 오기 요청을 작성하거나 작성자에게 알리십시오. 아마 좋은 일이지만 고통 스럽습니다.
Corey Alix

15

Angular2에 문제가 있었지만 로컬 저장 장치를 사용하여 무언가를 저장하고 있었기 때문에 불가능합니다.

솔루션 :

나는했다 localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

해결 방법 :

localStorage [ '도시']

(localStorage). 도시

(로컬 스토리지)


두 번째 옵션은 멋지지만 더 이상 일을하지 않는 것 같습니다. 접두사에 <any>- 를 붙이면 작동합니다 (<any>localStorage).city.
jayarjo

나는 이것이 오래되었다는 것을 알고 있지만 당신의 가장 좋은 예는 저에게 효과적이었습니다.
MacD

4

아무것도 작동하지 않는 빠른 수정 :

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

모범 사례는 아니지만 문자열없는 리터럴을 끄지 않고도 솔루션을 제공합니다.


나도이 작업을 수행하지만 Google Cloud와 같은 일부 플랫폼은 ab가 a [ 'b']보다 낫다는 경고 메시지를 표시합니다. 이것이 왜 그런지 아십니까?
Jonathan

1
확실하지는 않지만 예를 들어 tslint.json에서 ab를 선호하도록 옵션을 변경할 수 있습니다
danday74

3

지금은 2020 년이라는 것을 알고 있지만 질문의 "무시"부분을 만족하는 답변을 볼 수 없었습니다. 지시문을 사용하여 TSLint에 지시를 내릴 수 있습니다.

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

일반적으로 'someProp가 유형에 없습니다'라는 오류가 발생합니다. 주석이 있으면 오류가 사라집니다.

이렇게하면 컴파일 할 때 발생하는 모든 오류가 중지되고 IDE에서 사용자의 불만이 중지됩니다.


0

내 특정 프로젝트에서 나는 그것을 작동시키지 못하고 사용했다 declare var $;. 깨끗하고 권장되는 솔루션 은 아니지만 JQuery 변수를 인식하지 못하지만 사용 후 오류가 없었으며 자동 빌드가 성공해야했습니다.


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의 키로 사용하고 컴파일 할 수있는 유일한 방법 인 것처럼 보였습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.