새로운 Typescript 1.8.4 빌드 오류 :“빌드 : 'EventTarget'유형에 'result'속성이 없습니다. ”
나는 타이프 스크립트를 처음 사용합니다. 내 Durandal 응용 프로그램에서 VS-2012로 VS-2015로 마이그레이션 한 것은 typescript 0.9에서 typescript 1.8.4로 변경되었음을 의미합니다. 마이그레이션 후 너무 많은 빌드 오류가 발생했습니다. 나는 하나를 제외한 모든 것을 해결했습니다. 이벤트 유형에 대한 빌드 오류가 아래에 표시됩니다.
오류 : "빌드 : 'EventTarget'유형에 'result'속성이 없습니다."
그리고 코드는 정확히 다음과 같습니다.
var reader:any,
target:EventTarget;
reader= new FileReader();
reader.onload = function (imgsrc){
var fileUrl = imgsrc.target.result;
}
"Imgsrc"가 유형 이벤트를 받고 있습니다.
typescript 0.9에서는 잘 작동하지만 1.8.4에서는 'EventTarget'유형에 'result'가 없기 때문에 오류가 발생합니다. 누구든지이 문제를 해결할 수 있습니다.
참고 : "target : EventTarget"은 lib.d.ts에서 가져옵니다.
any
약 이지만 (거의 모든 것에 대한 것이지만 ... TypeScript의 이점은 어디에 있습니까?) ... 비슷한 문제 가보고되고 좋은 (TypesScript-ish) 해결 방법이 제안되었습니다.
lib.d.ts의 이벤트 인터페이스에서 currentTarget 변경 요청
인용하겠습니다 :
이 TS2339에 부딪 혔습니다 .JS FileReader onload의 'EventTarget'유형에 속성 'result'가 존재하지 않으며 FileReader의 onerror에 전달 된 이벤트에 대한 getSummary ()에 대한 또 다른 경고가 있습니다.
내 해결 방법은 끔찍한 빨간색 구불 구불 한 선을 억제하는 것입니다 .-)는 다음과 같습니다.
interface FileReaderEventTarget extends EventTarget { result:string } interface FileReaderEvent extends Event { target: FileReaderEventTarget; getMessage():string; }
그런 다음 내 앱에서 :
reader.onload = function(fre:FileReaderEvent) { var data = JSON.parse(fre.target.result); ... }
그리고 lib.d.ts가 약간 변경 될 때까지 알려진 인터페이스로 계속 작업합니다.
대신에 사용하는 event.target.result
, 당신은 사용할 수 있습니다 FileReader.result
.
예를 들면
const fileReader: FileReader = new FileReader();
fileReader.onload = (event: Event) => {
event.target.result; // This is invalid
fileReader.result; // This is valid
};
내 이전 유형 스크립트에서 "imgsrc"매개 변수는 기본적으로 모든 유형을 갖습니다.
그래서 이제는 (imgsrc : any)로 만들었습니다. 잘 작동합니다.
var reader:any,
target:EventTarget;
reader= new FileReader();
reader.onload = function (imgsrc:any){
var fileUrl = imgsrc.target.result;
}
문제는 typescript 정의에 있습니다. 간단한 치트는 다음과 같습니다.
let target: any = e.target; //<-- This (any) will tell compiler to shut up!
let content: string = target.result;
TypScript에게 예상되는 유형을 알려주십시오.
수정 사항은 다음과 같습니다.
let reader = new FileReader();
reader.onload = function (event){
let fileUrl = (<FileReader>event.target).result;
}
reader.result
이 경우 대신 사용할 수도 있습니다.
오늘 이것은 TypeScript 2.1.1에서 저에게 효과적이었습니다.
interface EventTarget { result: any; }
대신에
this.localDbRequest.onsuccess = function (event) {
const db = event.target.result;
};
하다
this.localDbRequest.onsuccess = function (event) {
const db = this.result;
};
대상 오브젝트가 수정 될 때까지 오류를 방지하기 위해 다음과 같이 액세스 할 수 있습니다 :
reader= new FileReader();
reader.onload = function (imgsrc){
var fileUrl = imgsrc.target["result"];
}
대상을 Javascript 객체로 취급
이 오류가 발생하면
Type 'string | ArrayBuffer '는'string '유형에 할당 할 수 없습니다. 'ArrayBuffer'유형은 'string'유형에 할당 할 수 없습니다.
fileReader.result + ''; // 유효한
fileReader.result; // 잘못된
이것은 javascript / typescript의 중단 변경입니다.
what you will need to do is to just replace "event.target.result" by "this.result".
"this" here refers to the context of interface "MSBaseReader".
below are my implementation excerpt:
let reader = new FileReader();
let profile: TransProfile = new TransProfile();
reader.onload = function(event){
profile.avatar = new Uint8Array(this.result);
}
reader.onerror = function(event){
}
this.photoLib.getPhoto(item)
.then(blob => reader.readAsArrayBuffer(blob))
.then(() => this.doUpload(profile));
"MSBaseReader" interface definition:
interface MSBaseReader {
onabort: (this: MSBaseReader, ev: Event) => any;
onerror: (this: MSBaseReader, ev: ErrorEvent) => any;
onload: (this: MSBaseReader, ev: Event) => any;
onloadend: (this: MSBaseReader, ev: ProgressEvent) => any;
onloadstart: (this: MSBaseReader, ev: Event) => any;
onprogress: (this: MSBaseReader, ev: ProgressEvent) => any;
readonly readyState: number;
readonly result: any;
abort(): void;
readonly DONE: number;
readonly EMPTY: number;
readonly LOADING: number;
addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: MSBaseReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
"FileReader" interface definition
interface FileReader extends EventTarget, MSBaseReader {
readonly error: DOMError;
readAsArrayBuffer(blob: Blob): void;
readAsBinaryString(blob: Blob): void;
readAsDataURL(blob: Blob): void;
readAsText(blob: Blob, encoding?: string): void;
addEventListener<K extends keyof MSBaseReaderEventMap>(type: K, listener: (this: FileReader, ev: MSBaseReaderEventMap[K]) => any, useCapture?: boolean): void;
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
}
also note that, due to the context change of "this" within "onload()", your class-based definitions are not accessible within "reader.onload = function(event){..."; meaning you can not use "this.class-property" style to address your class properties.
you will have to define local variable. see the definition and usage of "profile" in above excerpt.
The above solutions didn't fit my similar issue with IndexedDB so I thought I'd share what did work in my scenario. By changing the (event)
functions' arguments to (event: any)
I was able to ignore the type errors.
Sample Code:
let request = window.indexedDB.open('userChannels', 3);
request.onerror = function(event: any ) {
console.log('ERROR: Failed to create userChannels local DB' + event.target.errorCode)
};
request.onsuccess = function(event: any) {
let db = event.target.result;
console.log('SUCCESS: Created userChannels local DB')
};
'Development Tip' 카테고리의 다른 글
ORA-01795에 대한 해결 방법이 있습니까? 목록의 최대 표현식 수는 1000 오류입니까? (0) | 2020.11.19 |
---|---|
여러 대상이있는 Objective C to Swift 헤더 파일 (0) | 2020.11.19 |
DateAdd를 사용하여 날짜에 요일을 추가하는 SQL Server 2005 (0) | 2020.11.19 |
DataTable에서 데이터를 추출하려면 어떻게합니까? (0) | 2020.11.19 |
jQuery 문자열에서 문자열 제거 (0) | 2020.11.19 |