답변:
질문이 이미 닫 혔음을 알고 있지만 동일한 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
getBBox
적절하게 캐스팅하는 방법이 있습니까? 유형을 찾고 싶습니다 getBBox
?
getBBox
에있을 것 HTMLElement
유형이하여에 개체를 캐스팅 수 있습니다 var typedElement = <HTMLElement> outerHtmlElement;
.
var coordinates = (<any>outerElement[0]).getBBox();
빠르고 더러운 해결책은 명시 적으로 캐스팅하는 것입니다. 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"]
, not 으로 작성해야합니다 y.x
. 따라서이 관점에서 다른 옵션이 더 좋습니다.
:any
있습니까?
이 문제를 처리하는 방법에는 여러 가지가 있습니다. 이 객체가 일부 외부 라이브러리와 관련이있는 경우 가장 좋은 해결책은 해당 라이브러리에 대한 실제 정의 파일 (큰 저장소 here ) 을 찾아서 참조하는 것입니다. 예 :
/// <reference path="/path/to/jquery.d.ts" >
물론 이것은 많은 경우에 적용되지 않습니다.
유형 시스템을 '재정의'하려면 다음을 시도하십시오.
declare var y;
이렇게하면 원하는 전화를 걸 수 있습니다 var y
.
/// <reference path="/path/to/jquery.d.ts" />
마지막에 자체 닫는 태그가 있어야 함
npm install -g tsd
그때tsd install jquery
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;
Angular2에 문제가 있었지만 로컬 저장 장치를 사용하여 무언가를 저장하고 있었기 때문에 불가능합니다.
솔루션 :
나는했다 localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
해결 방법 :
localStorage [ '도시']
(localStorage). 도시
(로컬 스토리지)
<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
모범 사례는 아니지만 문자열없는 리터럴을 끄지 않고도 솔루션을 제공합니다.
HTMLElement
하고 추가getBBox
속성 이 있는 인터페이스를 만들 수도 있습니다 . 이렇게하면 다른 속성에서 코드를 완성 할 수 있습니다.