Typescript: JSX์˜ "์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฌด์‹œ"์ฝ”๋“œ ์ˆ˜์ •์œผ๋กœ`// @ ts-ignore`๊ฐ€ ๋ Œ๋”๋ง ๋จ

์— ๋งŒ๋“  2018๋…„ 10์›” 04์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript


TypeScript ๋ฒ„์ „ : 3.2.0-dev.20181004


๊ฒ€์ƒ‰์–ด:

disableJsDiagnostics
JSX
์ฝ”๋“œ ์ˆ˜์ •
์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฌด์‹œ
๋ชจ๋“  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— '@ ts-ignore'์ถ”๊ฐ€

์•”ํ˜ธ

// MyComponent.jsx
// @ts-check
import React from "react";

class MyComponent extends React.Component {
  render() {
    return (
      <div>
        // @ts-ignore
        {doesNotExist}
      </div>
    );
  }
}

export default MyComponent;

Ignore this error message ๋˜๋Š” Add '@ts-ignore' to all error messages ์ฝ”๋“œ ์ˆ˜์ •์„ ์‹คํ–‰ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ถฉ์กฑํ•˜๋Š” // @ts-ignore ๊ฐ€ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜,

<div>
  // @ts-ignore
  {doesNotExist}
</div>

์‹ค์ œ๋กœ // @ts-ignore ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘ :

{/* @ts-ignore */} ๋˜๋Š” {/* // @ts-ignore */} ์ด ์œ ํšจํ•œ ๋ฌด์‹œ ์ฃผ์„์œผ๋กœ ์ธ์‹๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ƒ๊ฐ ํ•ด๋‚ผ ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์€

<div>
  {/* 
  // @ts-ignore */}
  {doesNotExist}
</div>

์‹ค์ œ ํ–‰๋™ :

// MyComponent.jsx
// @ts-check
import React from 'react';

class MyComponent extends React.Component {
  render() {
    return (
      <div>
        // @ts-ignore
        {doesNotExist}
      </div>
    );
  }
}

export default MyComponent;

// @ts-ignore ์‹ค์ˆ˜๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ๋ฌธ์ œ:

https://github.com/Microsoft/TypeScript/issues/25240

Bug JSTSX Quick Fixes

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

(์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ

{/* 
  // @ts-ignore */}

๊ดœ์ฐฎ์•„?)

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

์ฐธ๊ณ  : ์ƒˆ ์–ต์ œ ์–‘์‹ (์˜ˆ : ์ธ๋ผ์ธ)์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ, ์œ ํšจํ•œ ์–ต์ œ ์œ„์น˜๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋น ๋ฅธ ์ˆ˜์ •์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

(์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ

{/* 
  // @ts-ignore */}

๊ดœ์ฐฎ์•„?)

์ƒˆ๋กœ์šด ์–ต์ œ ์–‘์‹์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋„ ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด JSX ๊ตฌ์กฐ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•œ ์ฃผ์„ ์–‘์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆ˜์ •์€ (1)์ด ์–‘์‹์— ํฌํ•จํ•˜๊ฑฐ๋‚˜ (2) ์ „ํ˜€ ํฌํ•จํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ Œ๋”๋ง์ด ๋๋‚˜์ง€ ์•Š์Œ). ๊ธฐ๋Šฅ์ ์œผ๋กœ ์ •ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ (1)์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™์ด JSX ๊ตฌ์„ฑ ์š”์†Œ ๋ณธ๋ฌธ์˜ ์˜ค๋ฅ˜๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊บผ์ ธ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์— ์ด์ƒํ•œ ๋ฌด์‹œ ์ฃผ์„์— ๋Œ€ํ•œ ์„ ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

const s = `
Hello ${doesnotexist}`;

์ˆ˜์ • ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค

const s = `
Hello ${
// @ts-ignore
doesnotexist}`;
{/* 
  // @ts-ignore */}

๊ต‰์žฅ ๐ŸŒน

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ •๋ง ์ด์ƒํ•œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

{/* 
  // @ts-ignore */}

์œ„์˜ ํŽธ์ง‘์€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ์˜ค๋Š˜๋‚  TSX ํŒŒ์ผ ๋‚ด์—์„œ typescript ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ๋‹จ์ผ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ง„์ˆ ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํฐ ๋„์ „์ž…๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ (์ด์ƒํ•ด ๋ณด์ด๋Š”) ๋ณ€ํ˜• :

<
// @ts-ignore
SomeComponent />

(์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ

{/* 
  // @ts-ignore */}

๊ดœ์ฐฎ์•„?)

์–ผ๋งˆ๋‚˜ ๋˜‘๋˜‘ ํ•˜๋ƒ !!!

์œ„์˜ ํŽธ์ง‘์€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ์‚ฌ๋žŒ๋“ค์€ TSX ํŒŒ์ผ ๋‚ด์—์„œ typescript ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ์—ฐ๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜๋Š” ๋‹จ์ผ ์†”๋ฃจ์…˜์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ง„์ˆ ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํฐ ๋„์ „์ž…๋‹ˆ๋‹ค.

Typescript 3.6.2์—์„œ .tsx ์—์„œ ์ž‘๋™

(์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ

{/* 
  // @ts-ignore */}

๊ดœ์ฐฎ์•„?)

์˜ˆ, ๋ชจ๋“  linting ๊ทœ์น™์€ ํ•ด๋‹น ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋งค์šฐ ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ˆ˜ํ–‰ : neutral_face :

    <   // eslint-disable-line react/jsx-tag-spacing
        // @ts-ignore
    Component/>

prettier๋Š” ์†์„ฑ์„ ๋ณ„๋„์˜ ์ค„์— ์œ ์ง€ํ•˜๊ณ  ์ด์ œ @ ts-ignore๋Š” ํƒœ๊ทธ์˜ ์‹œ์ž‘์ด ์•„๋‹Œ ์†์„ฑ ๋ฐ”๋กœ ์•ž์— ์œ„์น˜ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์˜ˆ๋ป์š”.

๋‚ด๊ฐ€ ๊ฐ€์ง„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */ /* prettier-ignore */}
    <MyComponent foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

์ด์ „ :

    {/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */}
    <MyComponent
      foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

๋” ์˜ˆ๋ป์ง€๋Š” ๊ฒƒ๋„ ๊ณผ๋„ํ•œ ์Šคํ”„๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ

    <MyComponent
      {...{}/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */}
      foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

๋˜ํ•œ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ์‹œ์ ์—์„œ ๋” ์˜ˆ์˜๊ฒŒ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. jsx ๋‚ด๋ถ€์—๋Š” ์ฃผ์„ ์œ„์น˜์— ๋Œ€ํ•œ ์˜ต์…˜์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ ์ด๊ฒƒ์ด ๋‹ซํ˜€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ถ”์•…ํ•œ ํ•ด๊ฒฐ์ฑ…์— ์ „๋… ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š” ...

์šฐ๋ฆฌ๋Š” ์ถ”์•…ํ•œ ํ•ด๊ฒฐ์ฑ…์— ์ „๋… ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋„ค. ํ€ต ํ”ฝ์Šค๋Š” ์ด์ œ ๋ชป์ƒ๊ธด ์ผ์„ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ถŒ๋ฆฌ์— ์˜ํ•ด ์˜ˆ์™ธ์  ์ธ ์‚ฌ๊ฑด์ด๋˜์–ด์•ผํ•˜๋Š” ํƒ„์••๊ณผ ๊ด€๋ จํ•˜์—ฌ "์˜ˆ์˜๋‹ค"๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค. ์šฐ๋ฆฌ๋Š” jsx ๊ตฌ๋ฌธ์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์— ์˜ํ•ด ๊ฝค ์ž ๊ฒจ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ ์ถ”์•…ํ•œ ํ•ด๊ฒฐ์ฑ…์— ์ „๋…ํ–ˆ์ง€๋งŒ ...

์ด ๊ณต๊ฐœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํˆฌํ‘œ / ๋™์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ž์œ  ์‹œ๊ฐ„์—์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํ˜„์žฌ ์†”๋ฃจ์…˜์ด ์„ ํ˜ธ๋˜๋Š” ์˜ต์…˜์ด๋ผ๋ฉด ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜์กดํ•˜๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ตœ์‹  ์ฝ”๋“œ์— ์ž˜๋ชป๋œ ์ž…๋ ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ฏธ๋ฃจ๋Š” ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์•…ํ•œ ์†”๋ฃจ์…˜์€ ํ˜„์žฌ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด ํ•œ ์ค„์งœ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ jsx์—์„œ ์ฃผ์„์„ ์–ป๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. {} ์ด๋‚ด ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”์ ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

{/* @ts-ignore */}
{whatever}

์ง€๊ธˆ ์—ด๋ ค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://github.com/microsoft/TypeScript/issues/37738
PR ์—ฌ๊ธฐ : https://github.com/microsoft/TypeScript/pull/38228 ๐ŸŽ‰

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค

{/* @ts-ignore */}
{whatever}

์ด๋ฅผ์œ„ํ•œ ์ตœ๊ณ ์ด์ž ๊ฐ€์žฅ ๋ณดํŽธ์  ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

์ž๋™ ์„œ์‹ ์ง€์ • ๋„๊ตฌ (์˜ˆ์œ ๋“ฑ)๋Š” ํ•ดํ‚น์„ ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธํŠธ :
์ด ์†”๋ฃจ์…˜์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

{/* 
  // @ts-ignore */}

์ด ๋™์•ˆ

<
// @ts-ignore
SomeComponent />

์ž๋™ ์„œ์‹์ด ์ง€์ •๋˜๊ณ  ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ๋ฉ๋‹ˆ๋‹ค (์ ์–ด๋„ ๋” ์˜ˆ์œ ์„ค์ •์—์„œ).

# 38228์˜ ์„ฑ๊ณต์„ ๋ฐ”ํƒ•์œผ๋กœ 3.9 : tada์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด JSX ๋ฌธ์ œ์— ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์˜ ๋‚ด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค ์ด :

import * as React from 'react';

declare var SomeComponentFromLibrary: React.FC<{
    children?: React.ReactElement
}>;

declare var MyComponent: React.FC<{
    foo: string,
}>;

export default () => (
    <SomeComponentFromLibrary>
        {/* @ts-expect-error */}
        <MyComponent />
    </SomeComponentFromLibrary>
)

SomeComponentFromLibrary ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ <MyComponent /> ์ƒ์„ฑํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ SomeComponentFromLibrary ์˜ ์ž์‹์— ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด children?: React.ReactElement ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์ด ๊นจ์ ธ ๋‹ค๋ฅธ ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š๋Š” ์ฃผ์„์„ JSX์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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