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.