Typescript: lib.d.ts์˜ ์ด๋ฒคํŠธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ currentTarget ๋ณ€๊ฒฝ ์š”์ฒญ

์— ๋งŒ๋“  2014๋…„ 07์›” 29์ผ  ยท  36์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

lib.d.ts์˜ Event ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฆฌ์Šค๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์ฝœ๋ฐฑ์€ Event ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Event์˜ currentTarget ์†์„ฑ์€ EventTarget ์œ ํ˜•์ž…๋‹ˆ๋‹ค (๋ฐ˜๋ฉด Element / HTMLElement ์œ ํ˜•์ด์–ด์•ผ ํ•จ).

lib.d.ts Suggestion help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

JS FileReader onload TS2339: Property 'result' does not exist on type 'EventTarget' ์—์„œ 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);
        ...
    }

์ƒ์„ฑ ๋œ JS ์ฝ”๋“œ๋Š” ์ข‹์•„ ๋ณด์ด๊ณ  ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋น„์ •์ƒ์ ์ธ JS ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์†”๋ฃจ์…˜์„ lib.d.ts์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์†”๋ฃจ์…˜์ด ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์œ ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  36 ๋Œ“๊ธ€

XMLHttpRequest ๊ฐ์ฒด๋„ currentTarget ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Element / HTMLElement๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ด์œ  ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์ด๊ฒƒ์„ ๊ฐœ์„ ํ• ๊นŒ์š”?

interface Event<T extends EventTarget> {
    /* ... */
    currentTarget: T;
    /* ... */
}

interface EventListener<T extends EventTarget> {
    (evt: Event<T>): void;
}

interface HTMLElement {
    /* ... */
    addEventListener(type: string, listener: EventListener<HTMLElement>, useCapture?: boolean): void;
}

๊ทธ๊ฒƒ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋จผ ๊ธธ์„ ๊ฐˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด iPhone์—์„œ ๋ณด๋ƒ„

2014 ๋…„ 8 ์›” 3 ์ผ 13:34์— SaschaNaz [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

XMLHttpRequest ๊ฐ์ฒด๋„ currentTarget ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Element / HTMLElement๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ด์œ  ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์ด๊ฒƒ์„ ๊ฐœ์„ ํ• ๊นŒ์š”?

์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฒคํŠธ{
/ * ... _ /
currentTarget : T;
/ _ ... * /
}

์ธํ„ฐํŽ˜์ด์Šค EventListener{
(evt : ์ด๋ฒคํŠธ) : ๋ฌดํšจ;
}

interface HTMLElement {
/ * ... * /
addEventListener (์œ ํ˜• : ๋ฌธ์ž์—ด, ๋ฆฌ์Šค๋„ˆ : EventListener, useCapture ?: ๋ถ€์šธ) : void;
}
โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋ชจ๋“  ์ด๋ฒคํŠธ ๋Œ€์ƒ์ด Element (http://www.w3.org/TR/DOM-Level-3-Events/#event-types)๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์žˆ๋Š” ์†”๋ฃจ์…˜์€ ๋” ๋งŽ์€ ๊ฒƒ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. @SaschaNaz ์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ.

๋ฌธ์ œ๋Š” ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ณต๊ฐœ ํ•  ์ˆ˜์—†๋Š” ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ lib.d.ts๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ํŒŒ์ผ์ด ์ƒˆ ํŒŒ์ผ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ์„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ, ์•ž์œผ๋กœ lib.d.ts ์ƒ์„ฑ ์Šคํฌ๋ฆฝํŠธ / ์ž…๋ ฅ์— ๋Œ€ํ•œ PR์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ 'Revisit'ํƒœ๊ทธ ์ง€์ •-ํ•œ ๋‹ฌ ์•ˆ์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ•‘์„ ๋ณด๋‚ด ์ฃผ์‹œ๋ฉด ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

interface HTMLElement {
    addEventListener(type: string, listener: EventListener<this>, useCapture?: boolean): void;
}

var image: HTMLImageElement;
var video: HTMLVideoElement;
image.addEventListener // receives EventListener<HTMLImageElement> type
video.addEventListener // receives EventListener<HTMLVideoElement> type

๊ทธ ๊ธฐ๋Šฅ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. # 285์™€ # 229์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,์ด ์Šค๋ ˆ๋“œ๋ฅผ ํ•‘ํ•ฉ๋‹ˆ๋‹ค. Event.target ์œผ๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํƒ€๊ฒŸ์ด HTMLElement ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์œ ํ˜•์ด ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. @SaschaNaz ์˜ ์ œ์•ˆ์„ ์‹œ๋„ํ•˜๊ณ  "์ค‘๋ณต ์‹๋ณ„์ž"๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค (์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค).

ํŽธ์ง‘ : ์ด๊ฒƒ์€ ๊ฒฝ๊ณ ๋ฅผ ์กฐ์šฉํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค : (<HTMLElement>event.target).tagName

@rayshan ์ œ์•ˆ์€ lib.d.ts ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ฒƒ์ด ์—ˆ์œผ๋ฉฐ ํŒŒ์ผ์€ Internet Explorer ๊ตฌํ˜„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋Š” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‚ด์žฅ lib ( --noLib )์—†์ด ๋นŒ๋“œํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ TypeScript์—์„œ DOM์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (๋Œ€๋ถ€๋ถ„ DOM์ด ๊ฐ€์žฅ ์ผ๊ด€๋œ / ๊ตฌ์กฐํ™” / ์œ ํ˜• ์•ˆ์ „ / ์ผ๊ด€๋˜๊ฒŒ ๊ตฌํ˜„ ๋œ API ์ง‘ํ•ฉ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—).

์ด์ œ # 4910์ด ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๊ฒ€ํ†  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@zhengbli ์—๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ์ƒ์„ฑ์ด ํ•„์š”ํ•œ lib.d.ts ๋ฌธ์ œ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PR์„ ํ™˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ lib.d.ts ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md#contributing -libdts-fixes

JS FileReader onload TS2339: Property 'result' does not exist on type 'EventTarget' ์—์„œ 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);
        ...
    }

์ƒ์„ฑ ๋œ JS ์ฝ”๋“œ๋Š” ์ข‹์•„ ๋ณด์ด๊ณ  ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋น„์ •์ƒ์ ์ธ JS ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์†”๋ฃจ์…˜์„ lib.d.ts์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์†”๋ฃจ์…˜์ด ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์œ ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ currentTarget์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ฐธ์กฐ๋Š” TSJS ์ƒ์„ฑ๊ธฐ์—์„œ ์ƒ์„ฑ ๋œ webworker.generated.d.ts ํŒŒ์ผ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค ๐Ÿ˜ž
๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ฑฐ์˜ 3 ๋…„ ๋œ์ด ๋ฌธ์ œ๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” TypeScript๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์ •๋ง ์Šฌํ”„๋‹ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ง์„ ์ž์ฃผ ๋“ฃ๋Š” ์ด์œ  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž˜. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. PR https://github.com/Microsoft/TSJS-lib-generator/pull/202๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋ฐ”๋ผ๊ฑด๋Œ€ ์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Property 'getBoundingClientRect' does not exist on type 'EventTarget'. ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Œ, PR์€ ๊ฑฐ์˜ 2 ๊ฐœ์›” ์ดํ›„๋กœ ๋ณด๋ฅ˜ ์ค‘์ž…๋‹ˆ๋‹ค. ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด ์žˆ์œผ๋ฉด ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

currentTarget ๋ฅผ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTMLInputElement.onchange ๋Š” (event: Event<HTMLInputElement>) => void ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ event.currentTarget.value ๋Š” ์บ์ŠคํŠธ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ฃผ์„์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. React์˜ ํƒ€์ดํ•‘์€์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ dom.lib.d.ts๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์„ ๋„์ž…ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋‘ ๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค .๐Ÿ˜ญ

์ด๋Ÿฌํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ React ์œ ํ˜•์— ๋˜‘๊ฐ™์ด ์ ์šฉ๋ฉ๋‹ˆ๊นŒ?

lib.d.ts์—๋Š” React ํƒ€์ดํ•‘์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ ๋ช…๋ น์— --diagnostics ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@felixfbecker ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์ด ๊ณง ์ˆ˜์ • ๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค์—ˆ๊ฑฐ๋‚˜ TypeScript๋ฅผ ํฌ๊ธฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ์‚ฌ๋žŒ์ด ๋„ˆ๋ฌด ์ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋ฒ„์ „ 1.18.0 (1.18.0)์— ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

...์™€ ๊ฐ™์€ ๋ฌธ์ œ์ด๋ฉฐ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

angular 4 ํ”„๋กœ์ ํŠธ๋ฅผ ํ”„๋กœ๋•์…˜์— ํ‘œ์‹œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ng serve ..๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ๋„๊ฐ€ ํ”„๋กœ๋•์…˜ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. Typescript๋กœ dom์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” 4 ๋…„ ์ „์ด๊ณ  ํ•ด๋‹น PR์€ ๊ฑฐ์˜ 1 ๋…„์ด ์ง€๋‚˜๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ๊ณง ์ˆ˜์ • ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” 4 ๋…„ ๋™์•ˆ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/Microsoft/TSJS-lib-generator/pull/207 ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ @saschanaz ๋Š” ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

11์‹œ์— Casting party tonite-๋ธŒ๋ผ์šฐ์ € ํƒญ ์–ธ๋กœ๋“œ :
confirmationMessage(event: BeforeUnloadEvent): any {
const activeElement: HTMLElement = <HTMLElement>(<Document>event.target).activeElement;

: ๋Œ„์‹ฑ ๋งจ :

์ถ”๊ฐ€๋Š” ์–ด๋–จ๊นŒ์š”

    readonly currentTarget: Element | null;
    readonly target: Element | null;

UIEvent ์—๋งŒ? ์ด๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
UIEvent์—์„œ์™€ ๊ฐ™์ด | null ์—†์ด๋„ ๋‘˜ ๋‹ค ํ•ญ์ƒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ. Typescript์™€ ํ•จ๊ป˜ Vue๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ–ˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ ํ•œ๋Œ€๋กœ ์ž…๋ ฅ ํ•„๋“œ์˜ ๊ฐ’์„ ์–ป๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ event.target.value๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ-์ œ ์ƒ๊ฐ์—๋Š” ํ…์ŠคํŠธ ์ž…๋ ฅ์ด ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ์œ ํ˜• any๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

this.url = (<any>event).target.result;

Event ๋ฐ EventTarget์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

interface Event<C = any, S = any, T = any> {
  ...
  currentTarget: EventTarget<C> | null;
  srcElement: EventTarget<S> | null;
  target: EventTarget<T> | null;
  ...
}

interface EventTarget<T = any> {
  ...
}

FileReader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์บ์ŠคํŠธํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

const fileReader = new FileReader();
fileReader.onload = $ev => {
  console.log($ev); // type ProgressEvent
  console.log($ev.target); // type FileReader
  // console.log($ev.target.result); // editor and autocomplete doesn't show any error
  console.log(($ev.target as FileReader).result); // casting compiles fine
};
fileReader.readAsText(file);

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งค๋ฒˆ event.target ๋˜๋Š” any-casting ์ด๋ฒคํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ์บ์ŠคํŒ…ํ•˜์ง€ ์•Š๊ณ  ( @gautamkrishnar ๊ฐ€ ์œ„์—์„œ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ)

์‚ฌ์‹ค, 6 ๋ฒˆ์งธ ์ƒ์ผ์ด๋˜๊ธฐ ์ „์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ๋‹ต๋ณ€์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์€ ์•„๋งˆ๋„ DOM, JSX ๋“ฑ์œผ๋กœ ์ž‘์—… ํ•  ๋•Œ ํ•˜๋ฃจ ๋™์•ˆ ๊ฐ€์žฅ ๊ท€์ฐฎ์€ ์ผ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์œ ์ผํ•œ ์ผ์ผ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ํ•˜๋ฃจ ์ข…์ผ ๋ฐฑ๋งŒ ๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์™œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

event.target๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ž์‹์ด ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์ž์‹์ด ๋งŽ์„ ๋•Œ ๋ถ€๋ชจ ์š”์†Œ์— ํด๋ฆญ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. event.target.tagName ๋˜๋Š” classList์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ œ๊ฐ€ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค .... ์ˆ˜๋…„ ๋™์•ˆ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. EventTarget์ด HTMLElement๋กœ ๋ถ„๋ฅ˜๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— tagName / classList์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์–ป์ง€ ๋ชปํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰