手を動かしながら学ぶ TypeScript Part 4 -- クラスベースで作成し, HTMLElement の型定義を深掘りする
14778 단어 typescript
왜
TS に強くなりたかった
イベント系の型を知りたかった
参考
SmartHR 手を動かしながら学ぶ TypeScript
P.163 汎用的な処理を書いてみよう
CRA 와 React 앱리작성
npx create-react-app clstodo --template typescript
TS 로작성
クラスベースに書き換えて 스타트 프로 파티를 を追加
class App extends React.Component {
start() {
console.log('hello world');
}
render() {
return (
<div className="App">
</div>
);
}
}
クラスで書き換えて,
render proparty の前に start procati を置く
これでブラウザで確認すると、start は動いていない.
부하 イventを読み取って
window.addEventListener('load', () => {
const app = new App({})
app.start()
})
브라우자노로드이벤트를 봐
App クラスを複製して 앱 クラスを作り
複製された app の start 프로 파티를 使う
すると console.log が動いた.
getElementById の型を追ってみる
const button = document.getElementById
('deleteAllDoneTask')
getElementById を深追いする.ctrl 클릭 をすると
lib.dom.d.ts に飛ぶ.
getElementById(elementId: string): HTMLElement | null;
引数の elementId に文字列 を受け取り
戻り値として HTMLElement 또는 null を返す
と言うことが読み取れる.
HTMLElement をさらに追ってみる
HTMLElement をさらに追ってみると
lib.dom.d.ts
/** Any HTML element. Some elements directly implement this interface, while others implement it via an interface that inherits it. */
interface HTMLElement extends Element, DocumentAndElementEventHandlers, ElementCSSInlineStyle, ElementContentEditable, GlobalEventHandlers, HTMLOrSVGElement {
accessKey: string;
readonly accessKeyLabel: string;
autocapitalize: string;
dir: string;
draggable: boolean;
hidden: boolean;
innerText: string;
lang: string;
//...
click(): void;
addEventListener
<K extends keyof HTMLElementEventMap>
(type: K, listener:
(this: HTMLElement, ev: HTMLElementEventMap[K])
=> any, options?: boolean | AddEventListenerOptions):
void;
addEventListener
(type: string, listener:
EventListenerOrEventListenerObject, options?:
boolean | AddEventListenerOptions): void;
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}
interface 에서 Element や Document 와 EventElement handrato GlobalEvent handra拡張して
その中におなじみの draggable, innerText, lang, などあり
クリックや EventListner 추가/제거 もあり、ここで定義されていることがわかった.
これらは HTMLElementEventMap と言うものから拡張されている
HTMLElementEventMap
これを追ってみると
interface HTMLElementEventMap extends ElementEventMap, DocumentAndElementEventHandlersEventMap, GlobalEventHandlersEventMap {
}
これらのイベントマップから拡張されている.
一つ一つ追ってみる.
ElementEventMap
interface ElementEventMap {
"fullscreenchange": Event;
"fullscreenerror": Event;
}
ElementEventMap은 fulskrinの適用? 에라노미가가는
DocumentAndElementEventHandlersEventMap
interface DocumentAndElementEventHandlersEventMap {
"copy": ClipboardEvent;
"cut": ClipboardEvent;
"paste": ClipboardEvent;
}
DocumentAndElementEventHandler아이벤트맵에
복사, 잘라내기, 붙여넣기 のコピペイベントがある
GlobalEventHandlersEventMap
interface GlobalEventHandlersEventMap {
"keydown": KeyboardEvent;
"keypress": KeyboardEvent;
"keyup": KeyboardEvent;
"load": Event;
"mouseleave": MouseEvent;
"mousemove": MouseEvent;
"mouseout": MouseEvent;
"mouseover": MouseEvent;
"mouseup": MouseEvent;
"pause": Event;
"play": Event;
"select": Event;
"selectionchange": Event;
"selectstart": Event;
"slotchange": Event;
"stalled": Event;
"submit": SubmitEvent;
}
글로벌에
등 HTML におけるほとんどのイベントがあることがわかった
これでHTMLElement の大枠が掴めた.
まとめ
クラスベースで TS をかくと、そのクラスのメソddを使うときは、
新しく new でコピーを作っ コピーの同名메소드を使う必要があり
HTMLEvent の 型を掘っていく와 GlobalEventHandlersEventMap
に行き着き、ここに殆どの HTML 要素でのイベントの型が入っていた.
Reference
이 문제에 관하여(手を動かしながら学ぶ TypeScript Part 4 -- クラスベースで作成し, HTMLElement の型定義を深掘りする), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaede_io/shou-wodong-kasinagaraxue-bu-typescript-part-4-kurasubesudezuo-cheng-si-htmlelement-noxing-ding-yi-woshen-jue-risuru-3okd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)