Dream๐Ÿฐng
article thumbnail

๐Ÿ’ [230327 TIL] Understanding TypeScript

Project Drag & Drop 1๏ธโƒฃ

! & as

TypeScript์—์„œ DOM ์กฐ์ž‘ํ•  ๋•Œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ

class ProjectInput {
  templateElement: HTMLTemplateElement;
  hostElement: HTMLDivElement;

  constructor() {
    this.templateElement = document.getElementById(
      'project-input'
    )! as HTMLTemplateElement;
    this.hostElement = document.getElementById('app')! as HTMLDivElement;
  }
}

document.getElementById('id');์—์„œ !๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ ๋Š” TypeScript๊ฐ€ ์ด๊ฒƒ์ด null์ผ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ถ”๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

!๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด null์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.

 

document.getElementById('id')!;๋กœ null์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ๊นŒ์ง€ ์•Œ๋ ค์ฃผ์—ˆ๋Š”๋ฐ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š”๋ฐ,

getElementById๋Š” id ์ •๋ณด๋กœ HTML ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— TypeScript๋Š” ๊ฐ€์ ธ์˜จ ์š”์†Œ๊ฐ€ div์ธ์ง€ a์ธ์ง€ li์ธ์ง€ ๋“ฑ๋“ฑ.. ๋ชจ๋ฅธ๋‹ค!

ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์–ด๋–ค ์š”์†Œ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ type casting์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด document.getElementById('id')! as HTMLDivElement;์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ ์ด ์ฝ”๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

const div = document.getElementById('im-div')! as HTMLDivElement;
const div = <HTMLDivElement>document.getElementById('im-div');

 

importNode

importNode()๋Š” ๋…ธ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

const node = document.importNode(externalNode, deep);

2๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•„์š”๋กœํ•˜๋Š”๋ฐ,

externalNode๋Š” ๋‹ค๋ฅธ ๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์˜ฌ ๋…ธ๋“œ์ด๊ณ 

deep์€ booleanํƒ€์ž…์œผ๋กœ externalNode์˜ ์ž์‹ ์š”์†Œ๋“ค์„ ํฌํ•จํ•˜์—ฌ ๋ณต์‚ฌํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

class ProjectInput {
  templateElement: HTMLTemplateElement;
  hostElement: HTMLDivElement;

  constructor() {
    this.templateElement = document.getElementById(
      'project-input'
    )! as HTMLTemplateElement;
    this.hostElement = document.getElementById('app')! as HTMLDivElement;

    const importedNode = document.importNode(
      this.templateElement.content,
      true
    );
  }
}

importedNode๋Š” templateElement.content(template ํƒœ๊ทธ ์‚ฌ์ด์˜ HTML ์ฝ”๋“œ)๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ๊ทธ ์ž์‹ ์š”์†Œ๋“ค์˜ ๋‚ด์šฉ์„ ์ „๋ถ€ ์ทจํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ, importedNode์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋ณด๋ฉด TypeScript๊ฐ€ ์Šค์Šค๋กœ ํƒ€์ž…์„ DocumentFragment๋กœ ์ถ”๋ก ํ•œ๋‹ค.


DocumentFragment๋Š” DOM๊ณผ ๋ณ„๊ฐœ๋กœ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—๋งŒ ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ป๋ฐ๊ธฐ ๊ฐ™์€ ์กด์žฌ๋‹ค.
DOM ํŠธ๋ฆฌ์— ์ง์ ‘ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์ข‹๋‹ค.
React์—์„œ๋„ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ์‹ธ์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธธ ๋•Œ <Fragment></Fragment>๋ฅผ ์“ฐ๋ฉด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค..!

 

insertAdjacentElement()

insertAdjacentElement()๋Š” ํŠน์ • ์œ„์น˜์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

targetElement.insertAdjacentElement(position, element);

2๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•„์š”๋กœ ํ•˜๊ณ  ๊ฐ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

position์€ targetElement์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–ด๋””์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•œ๋‹ค.

  • 'beforebegin' : targetElement ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค.
  • 'afterbegin' : targetElement ๋‚ด๋ถ€์˜ ์ฒซ๋ฒˆ์งธ ์ž์‹ ์•ž์— ์‚ฝ์ž…ํ•œ๋‹ค. (targetElement์˜ ์ฒซ๋ฒˆ์งธ ์ž์‹์ด ๋˜๋Š” ๊ฒƒ)
  • 'beforeend' : targetElement ๋‚ด๋ถ€์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค. (targetElement์˜ ๋งˆ์ง€๋ง‰ ์ž์‹์ด ๋˜๋Š” ๊ฒƒ)
  • 'afterend' : targetElement ๋’ค์— ์‚ฝ์ž…ํ•œ๋‹ค.

position์€ string์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•จ!
'beforebegin', 'afterbegin', 'beforeend', 'afterend'

element๋Š” ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ์š”์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

class ProjectInput {
  templateElement: HTMLTemplateElement;
  hostElement: HTMLDivElement;
  element: HTMLFormElement;

  constructor() {
    this.templateElement = document.getElementById(
      'project-input'
    )! as HTMLTemplateElement;
    this.hostElement = document.getElementById('app')! as HTMLDivElement;

    const importedNode = document.importNode(
      this.templateElement.content,
      true
    );
    this.element = importedNode.firstElementChild as HTMLFormElement;
    this.attach();
  }

  private attach() {
    this.hostElement.insertAdjacentElement('afterbegin', this.element);
  }
}

element๋Š” importedNode์˜ ์ž์‹ ์ค‘ ์ฒซ๋ฒˆ์งธ์ธ form ์š”์†Œ์ด๋‹ค.

attach() ๋ฉ”์†Œ๋“œ๋Š” hostElement ์•ž์— element๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ™”๋ฉด


app.ts๊ฐ€ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ npm start๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋นˆ ํ™”๋ฉด๋งŒ ๋‚˜์˜ค๋Š”๋ฐ,
html ์š”์†Œ๋“ค์ด template ํƒœ๊ทธ ์•ˆ์— ์ˆจ์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
template๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ์ˆœ๊ฐ„ ์ฆ‰์‹œ ๊ทธ๋ ค์ง€์ง€๋Š” ์•Š์ง€๋งŒ DOM ์กฐ์ž‘์„ ํ†ตํ•ด ํ™”๋ฉด์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

Binding error

  private submitHandler(event: Event) {
    event.preventDefault();
    console.log(this.titleInputElement.value);
  }

  private configure() {
    this.element.addEventListener('submit', this.submitHandler);
  }

element์˜ form์ด ์ œ์ถœ๋˜๋ฉด submitHandler๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

Title์— ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๊ณ  ์ œ์ถœํ•ด๋ณด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด configure()์—์„œ submitHandler() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ๋ฐ”์ธ๋”ฉํ•ด๋‘์—ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž‘๋™๋˜๋Š” submitHandler()๋Š” this๋ฅผ ๋‹ค์‹œ ์ด๋ฒคํŠธ ๋Œ€์ƒ์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— this๊ฐ€ class๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ submitHandler()๊ฐ€ ๋ฐ”์ธ๋”ฉํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

  private configure() {
    this.element.addEventListener('submit', this.submitHandler.bind(this));
  }

์ด ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” this์™€ submitHandler()๊ฐ€ ์ฐธ์กฐํ•˜๋Š” this๊ฐ€ ๋™์ผํ•ด์ง„๋‹ค.

 

๋‹ค๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์„ ๋•Œ ๋งค๋ฒˆ ๋ฐ”์ธ๋”ฉ์„ ๋”ฐ๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๋„ ๋˜ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋‹ค.

https://monshou.tistory.com/118#article-1-2--autobind-decorator

 

[TS] Decorators 2๏ธโƒฃ

Decorators 2๏ธโƒฃ Decorator the synthetic sugar ํด๋ž˜์Šค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” constructor๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๊ธฐ์กด constructor๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. constructor๋ฅผ ํ™•์žฅํ•  ๋•Œ super();๋Š” ๊ธฐ์กด ํด๋ž˜์Šค ํ™•์žฅ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ์กด ํด๋ž˜

monshou.tistory.com

 

autobind ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ ์šฉํ•œ ๋’ค์˜ ํ™”๋ฉด

'๐Ÿ“ Study > TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TS] Drag & Drop 3๏ธโƒฃ  (3) 2023.03.31
[TS] Drag & Drop 2๏ธโƒฃ  (3) 2023.03.30
[TS] Decorators 3๏ธโƒฃ  (0) 2023.03.24
[TS] Decorators 2๏ธโƒฃ  (0) 2023.03.22
[TS] Decorators 1๏ธโƒฃ  (1) 2023.03.20
profile

Dream๐Ÿฐng

@shoupeach

๐Ÿฐ Happy new rabbit! ๐Ÿฐ

profile on loading

Loading...