Material-ui: ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ํƒ€์ดํ•‘์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 01์›” 07์ผ  ยท  70์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mui-org/material-ui

# 18128 ์—์„œ

๊ฐ€์žฅ ์ •ํ™•ํ•œ ์œ ํ˜•(์ตœ์ƒ์˜ ์˜ค๋ฅ˜ ๋ฐ ํŽธ์ง‘๊ธฐ ์™„์„ฑ ์ œ๊ณต)๊ณผ ๋น ๋ฅธ ์œ ํ˜• ๊ฒ€์‚ฌ(์ŠคํŽ™ํŠธ๋Ÿผ์˜ ๋งจ ๋์€ any ์ž„) ์‚ฌ์ด์—๋Š” ํ•ญ์ƒ ๊ธด์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/microsoft/TypeScript/issues/34801 ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋Š” Material-UI๊ฐ€ ์„ฑ๋Šฅ์„ ํšŒ๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ™•์„ฑ์„ ์™„ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์กฐ์‚ฌํ•œ repos์—์„œ ๋งŽ์€ ์ˆ˜์˜ CSS ์†์„ฑ ์ด๋ฆ„์—์„œ ๋งŽ์€ ์†๋„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(https://github.com/mui-org/material-ui/blob/master/packages/ ์ฐธ์กฐ). material-ui-styles/src/withStyles/withStyles.d.ts). ํ™œ์„ฑ CSS ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ์ˆœ์ง„ํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์ž˜ ์•Œ๋ ค์ง„ ๊ฐ CSS ์†์„ฑ์— ๋Œ€ํ•œ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ํฌ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ?
2) CSSProperties ์œ ํ˜•์€ "์˜์‚ฌ ์„ ํƒ๊ธฐ ๋ฐ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ"๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ œํ•œ๋œ ๋…์„œ์— ๋”ฐ๋ฅด๋ฉด ์ถ”๊ฐ€ CSS ์†์„ฑ์˜ ์ด๋ฆ„์ด ์ง€์ •๋œ ๊ฐ€๋ฐฉ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
a) ์ด ๋ฐฑ ์ž์ฒด๊ฐ€ ์žฌ๊ท€์ ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ถ”๊ฐ€ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, width ์—์„œ foo.width ๋˜๋Š” foo.bar.width ๋“ฑ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๊นŒ? ํ•œ ์ˆ˜์ค€์ผ ๊ฒฝ์šฐ ์œ ํ˜•์„ ๋‹จ์ˆœํ™”ํ•˜๋ฉด ๋กœ์ปฌ ์žฌํ˜„์ด 4.6์ดˆ์—์„œ 3.6์ดˆ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค(์ฆ‰, ํฐ ์Šน๋ฆฌ).
b) ์Šค์Šค๋กœ ์œ ํ˜•์„ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  BaseCSSProperties[keyof BaseCSSProperties] ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ - ๋‹น์‹ ์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ - ๊ทธ๊ฒƒ์€ ๋ณ„๋กœ ์œ ์šฉํ•œ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  CSS ์†์„ฑ์€ (๊ธฐํƒ€) CSS ์†์„ฑ์˜ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” any ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋‚ซ์Šต๋‹ˆ๋‹ค.
3)์—์„œ StyleRules ์–ด๋–ค ์†์„ฑ์ด์—†๋Š” ๊ฒฝ์šฐ, ๋‹น์‹ ์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์–ป์„ CSSProperties ๋˜๋Š” () => CSSProperties ์˜๋ฏธ๊ฐ€์žˆ๋Š” (์ด ๋‚ด๊ฐ€ ํ‹€๋ฆด "CSSProperties๋ฅผ thunked"ํ˜ธ์ถœ) - CSSProperties ๊ฒŒ์œผ๋ฅธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ, ๋‹น์‹ ์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์–ป์„ CreateCSSProperties<Props> ์˜๋ฏธ๊ฐ€์žˆ๋Š” - Props ์ปดํ“จํŒ…ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค CSSProperties - ๋˜๋Š” (props: Props) => CreateCSSProperties<Props> , ์–ด๋–ค I didn๋ฅผ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ด์ค‘ ๊ฒŒ์œผ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. CreateCSSProperties ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด Props ํ•œ ๋ฒˆ ์ „๋‹ฌํ•œ ๋‹ค์Œ ๊ฐœ๋ณ„ ์†์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ "๋”๋ธ” ์ฝํฌ"์ž…๋‹ˆ๊นŒ?

์ด์™€ ๋ณ„๋„๋กœ IsEmptyInterface ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด์ ์— ๋น„ํ•ด ๋„ˆ๋ฌด ๋น„์‹ธ๋‹ค๋Š” ๊ฒƒ์„ ์˜์‹ฌํ•˜์ง€๋งŒ ์•„์ง ์ž…์ฆํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด์ ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ, ์ข€ ๋” ๋“ค์–ด๋ณด์‹œ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •ํ™•์„ฑ๊ณผ ์„ฑ๋Šฅ ๊ฐ„์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ท ํ˜•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ฐธ๊ณ : "์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ"๋Š” ๋ถ„๋ช…ํžˆ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ „๋žต์ด์ง€๋งŒ ์ตœ์ ํ™”ํ•˜๊ธฐ ์ „์— ํƒ€์ดํ•‘์„ ์ข‹์€ ์œ„์น˜์— ๋†“๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.) ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

performance typescript

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

์˜ค๋Š˜ ๋‚ด ํ”„๋กœ์ ํŠธ์— Material UI( 4.9.4 )๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. withStyles() ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๊ฐ„๋‹จํ•œ <Slider/> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” IDE์˜ ์ฆ‰๊ฐ์ ์ธ TypeScript ํ”ผ๋“œ๋ฐฑ์—์„œ ๋•Œ๋•Œ๋กœ 5-10์ดˆ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๊ฒƒ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ Material UI์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ - ๊ตฌ์„ฑ ์š”์†Œ). ์ด๋Ÿฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ญ”๊ฐ€ ํฌ๊ฒŒ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค). @amcasey ๊ฐ€ ์ข‹์€ ์กฐ์‚ฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ @material-ui ๋Œ€ํ•œ ๋ชจ๋“  TypeScript ํ•ญ๋ชฉ์„ ์ตœ์†Œํ•œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ๋ชจ๋“ˆ any ). ํ•˜์ง€๋งŒ TypeScript๋Š” ๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” material-ui ์œ ํ˜•์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ˆ, ์‹ค์ œ ์›น ํ‘œ์ค€์—์„œ ์„ ์–ธ๋œ ๋ชจ๋“  CSS ์†์„ฑ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์›์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. a) ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ 2๋ณด๋‹ค ํฐ ๊นŠ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    ```ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ
    const ์Šคํƒ€์ผ = (ํ…Œ๋งˆ: ํ…Œ๋งˆ) =>
    createStyles({
    somediv: {
    '&:ํ˜ธ๋ฒ„ ๋ฒ„ํŠผ': {
    ๊ฐ€์‹œ์„ฑ: '๊ฐ€์‹œ์„ฑ',
    ๋ถˆํˆฌ๋ช…๋„: 1,
                ':after': {
                    content: 'x',

                    [theme.breakpoints.up('lg')]: {
                        content: 'close',
                    },
                }
            },
        }
    });
```
b) I do not understand why `BaseCSSProperties[keyof BaseCSSProperties]` is needed there

  1. (props: Props) => CreateCSSProperties<Props> ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” material-ui ์œ ํ˜•์˜ ๋ฒ„์ „์—์„œ ์ด ์œ ํ˜•์„ ์ œ์™ธํ–ˆ๊ณ  ๋‚˜์œ ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 3.9.3์˜ ์œ ํ˜• ๊ตฌํ˜„์„ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์—์„œ๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๊ณ  ํƒ€์ดํ•‘์ด ์ข‹์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋จผ์ € ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ๋Š๋ฆฐ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฒค์น˜๋งˆํ‚นํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์ž˜ ์•Œ๋ ค์ง„ ๊ฐ CSS ์†์„ฑ์— ๋Œ€ํ•œ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๊ณ  ํฌ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—์„œ ํŽธ๊ฒฌ์ด ์—†๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋” ๋„“์€ ์ƒํƒœ๊ณ„๋ฅผ ๋ณด๋”๋ผ๋„ ํฌ๊ธฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Chrome devtools์—๋Š” ์ด ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉฐ style ์†Œํ’ˆ์„ CSSProperties ๋“ฑ์œผ๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. IDE์—์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์—†๊ณ  ํ…์ŠคํŠธ ์žฅ์‹์ธ์ง€ ๊ธ€๊ผด ์žฅ์‹์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๋ณ€ํ™˜.

  1. [...]
    ์ด ๊ฐ€๋ฐฉ ์ž์ฒด๊ฐ€ ์žฌ๊ท€์ ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ถ”๊ฐ€ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” CSS-in-JS ์†”๋ฃจ์…˜์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ CSS์˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” ์žฌ๊ท€์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์žฌ๊ท€์„ฑ์„ ์—†์• ๊ณ  ๋ณด๊ณ ๋ฅผ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ์ค‘์ฒฉ๋œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” and ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‘ ๊ฐ€์ง€ ์ˆ˜์ค€์œผ๋กœ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์˜์‚ฌ ์„ ํƒ๊ธฐ์šฉ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹IMO ์œ ํ˜•์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const styles = {
  root: {
    '<strong i="18">@media</strong> (max-width: 12cm)': {
      ':hover': {}
    }    
  }
}

@oliviertassinari๋ฅผ ์“ฐ๋Š” ์ž์‹ ์„ ๋ณธ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

  1. [...]
    CSSProperties - ๋˜๋Š” (props: Props) => CreateCSSProperties, ํšจ๊ณผ์ ์œผ๋กœ ์ด์ค‘ ๊ฒŒ์œผ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. CreateCSSProperties๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด Props๋ฅผ ํ•œ ๋ฒˆ ์ „๋‹ฌํ•œ ๋‹ค์Œ ๊ฐœ๋ณ„ ์†์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ "๋”๋ธ” ์ฝํฌ"์ž…๋‹ˆ๊นŒ?

์ธ์ˆ˜ ์ž์ฒด๊ฐ€ ์†์„ฑ ๋ชจ์Œ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ํ…Œ๋งˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์†์„ฑ ๋ชจ์Œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ๋งˆ(React์˜ ์ปจํ…์ŠคํŠธ API๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ๋˜๋Š” ์†Œํ’ˆ(๊ตฌ์„ฑ ์š”์†Œ์— ์ง์ ‘ ์ „๋‹ฌ๋จ):

makeStyles({ root: { color: 'blue' }}); // A
makeStyles(theme => ({ root: { color: theme.color } })); // B
makeStyles({ root: props => ({ color: props.color})}); // C
makeStyles({ root: { color: props => props.color } }); // D: same as C, only exists for dev ergonomics
makeStyles(theme => ({ root: props => ({ color: props.color || theme.color }) })); // E: what you called "double-lazy"

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ง€์—ฐ ํ‰๊ฐ€๋ณด๋‹ค๋Š” ์ปจํ…์ŠคํŠธ์™€ ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๋ณ„๋„๋กœ IsEmptyInterface๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด์ ์— ๋น„ํ•ด ๋„ˆ๋ฌด ๋น„์‹ธ๋‹ค๋Š” ๊ฒƒ์„ ์˜์‹ฌํ•˜์ง€๋งŒ ์•„์ง ์ž…์ฆํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด์ ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ, ์ข€ ๋” ๋“ค์–ด๋ณด์‹œ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์‚ฌ์šฉ๋˜๋Š” ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•˜๋‹ค

const useStaticStyles = makeStyles({ root: { color: 'blue' } });
const useDynamicStyles= makeStyles({ root: { color: props =>  props.color } })
function Component() {
  const staticClasses = useStaticStyles(); // No error
  const throwingClasses = useDynamicStyles(); // $ExpectError
  const dynamicClasses = useDynamicStyles({ color: 'blue' });
}

makeStyles ์—์„œ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์„œ๋ช…์„ ์œ ์ถ”ํ•˜๋ ค๋ฉด(์ฆ‰, useSomeStyles ์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ํ›„ํฌ). makeStyles ์–ด๋–ค ์Šคํƒ€์ผ ๋ฐฑ์ด ์ „๋‹ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. style bag ์— ์‚ฌ์šฉ๋œ props ์œ ํ˜•์„ ์œ ์ถ” ํ•˜๋Š” {} ์œ ํ˜•์„ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ IsEmptyInterface Props์˜ ์œ ์ถ”๋œ ์œ ํ˜•์„ ํ™•์ธํ•˜๊ณ  ํ•œ ๋ถ„๊ธฐ์— ๋Œ€ํ•ด 0 ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ˜ธ์ถœ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ๋ถ„๊ธฐ์— ๋Œ€ํ•ด ์œ ์ถ”๋œ props ์œ ํ˜•( StylesRequireProps ๋ฐ StylesHook .

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ: useStaticStyles({}) ๋˜๋Š” useStaticStyles(null as any) ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. https://github.com/mui-org/material-ui/pull/14019 ์—์„œ . ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ ์„œ๋ช…์„ ๊ฒฐ์ •ํ•˜๋Š” ํšŒ๋กœ๋ฅผ ๋‹จ๋ฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ˜ธ์ถœ ์„œ๋ช…์„ ์˜ค๋ฒ„๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด "๊ธฐ๋Šฅ"์˜ ๋ฌธ์ œ๋Š” ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์œ ๋ฅผ ์ดํ•ดํ•œ๋‹ค๋ฉด null as any ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Material-UI๋‚˜ TypeScript์— ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋Œ€๋ถ€๋ถ„์˜ ์Šคํƒ€์ผ๋ง์€ ์–ด์จŒ๋“  ์†Œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šฐ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ์„œ๋ช…, ์ฆ‰ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” props๋ฅผ ์˜ˆ์ƒํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

withStyles ๋˜๋Š” makeStyles ์‚ฌ์šฉ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํฌ๋กค๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ props ์‚ฌ์šฉ๋ฒ•๋งŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

@oliviertassinari๋ฅผ ์“ฐ๋Š” ์ž์‹ ์„ ๋ณธ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

@eps1lon ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ด ์ค‘์ฒฉ์ด ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: <strong i="8">@media</strong> (hover: none) ). ๊ทธ๋Ÿฌ๋‚˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” ๊ทธ๋ฆฌ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์˜์—ญ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์ ˆ์ถฉ์•ˆ์˜ ์ผ๋ถ€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@beholderrk

  1. ๋‚˜๋Š” ์ถฉ๋ถ„ํžˆ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋‚ด๊ฐ€ ๋ฌผ์–ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  2. ) ๊นŠ์ด 2๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊นŠ์ด 1๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ค‘๋ณต์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    b) ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋จธ๋ฆฌ๋ฅผ ์“ฐ๋Š” ๋ฐ ๊ฝค ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ  ํ…์ŠคํŠธ ๋Œ€์‹  ์ง์ ‘ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ๋ชจ๋“  ์†์„ฑ์ด ๋™์ผํ•œ ์œ ํ˜•์„ ๊ฐ–๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๋“ค ๋ชจ๋‘์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์†์„ฑ ์œ ํ˜•์˜ ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. BaseCSSProperties[keyof BaseCSSProperties] - ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์†์„ฑ์— ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CSS์—์„œ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์†์„ฑ์ด name: string ๋ฐ width: number ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์†์„ฑ ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋Š” ์ธ๋ฑ์Šค ์„œ๋ช…์„ ์ง€์ •ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์†์„ฑ์ด string | number ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. name ๋Š” number width ๊ฐ€ ๋˜์ง€ ์•Š๊ณ  string ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์‹ค์ œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ - ๊ทธ๊ฒƒ์„ ํ•˜๋Š” "์˜๋ฆฌํ•œ" ํ•ดํ‚น์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์‹ค์ œ๋กœ ์œ ํ˜•์— name: string , width: number ๋˜๋Š” x: CSSProperties ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ x ๋Š” name ๋˜๋Š” width ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  3. @eps1lon ์ด ์ด์— ๋Œ€ํ•ด ํ•  ๋ง์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ

์ •์ƒ ์ž‘๋™์ด ํ™•์ธ๋œ ๊ธฐ์ค€์„ ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ ๋งํฌ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?
์ˆ˜์ •: ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

@eps1lon ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์–ด

  1. ์—ฌ๊ธฐ์—๋Š” ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋Œ€ํ™”๋ฅผ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ฐ ์—ฌ์ญค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  2. ๋‘ ๊ฐœ์˜ ๋ ˆ์ด์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์œ ํ˜•์ด ์—ฌ์ „ํžˆ ๋Œ€๋ถ€๋ถ„ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜). ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ๋งฅ๋ฝ์ด ๋ถ€์กฑํ•ด์„œ ํ…Œ๋งˆ์™€ ์†Œํ’ˆ์ด ๋‹ค๋ฅธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ์กฐ๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

isEmptyInterface ์™€ ๊ด€๋ จํ•˜์—ฌ ์†์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ (์˜ˆ:) useStaticStyles ์˜ต์…˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜ธ์ถœ์ž๊ฐ€ ์˜ˆ์ƒํ•  ๋•Œ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋œ ์ •ํ™•ํ•˜์ง€๋งŒ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ›จ์”ฌ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•œ ์ˆซ์ž๋‚˜ ์–ด๋–ค ๊ฒƒ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚ด ์ถ”์ธก์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

2(b)์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์†์„ฑ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋˜๊ณ  ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ๋งŽ์€ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์œ ํ˜•์€ ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

isEmptyInterface์™€ ๊ด€๋ จํ•˜์—ฌ (์˜ˆ๋ฅผ ๋“ค์–ด) useStaticStyles์— ๋Œ€ํ•œ properties ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋จผ์ € ํ˜ธ์ถœ ์„œ๋ช…์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ์‹คํ—˜์„ ํ•˜๊ณ  ์ด๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ญ์ƒ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค์–ด ์†Œ๋ฆฌ๋ฅผ ์ค„์ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ์‹ค์ˆ˜๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ €์ง€๋ฅผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋ฆฌ๋ฅผ ๋œ ๋“ค๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ‰์†Œ๋ณด๋‹ค ๋” ์•ˆ์ „ํ•ด ๋ณด์ด๋ฉฐ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ์„ฑ๊ณผ๋ฅผ ๊ฑฐ๋‘์ง€ ๋ชปํ•œ๋‹ค๋ฉด ํŒ๋งคํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์›๋ž˜ ๋ฌธ์ œ(https://github.com/microsoft/TypeScript/issues/34801#issue-514055289)์— ๋Œ€ํ•ด ์ƒ์„ฑ๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2(b)์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์†์„ฑ ์ด๋ฆ„์ด ํ—ˆ์šฉ๋˜๊ณ  ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ๋งŽ์€ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์œ ํ˜•์€ ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ค์ˆ˜๋กœ ๊ฑด๋„ˆ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค. IsEmptyInterface ์‹คํ—˜ ํ›„์— ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@eps1lon ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ isEmptyInterface ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

#19320์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ์ผ๋ถ€ ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ์œ ํ˜•์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค( IsEmptyInterface ๋ฐ ๋ชจ๋“  ๋ถ€์šธ ๋…ผ๋ฆฌ ์œ ํ˜• ์ œ๊ฑฐ). ์ฝ”๋“œ๊ฐ€ ์ ์€ ๊ฒƒ ์™ธ์—๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ TS 3.2.4์™€ 3.7.4 ์‚ฌ์ด๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ง๋ถ™์ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์œ ํ˜• ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋Š” 3.2.4์— ๋น„ํ•ด 3.7.4์—์„œ 50% ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(~90์ดˆ ๋Œ€ 50์ดˆ).

CSSProperties์˜ ๊นŠ์ด๋ฅผ ์ œํ•œํ•˜๊ณ  ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋ฐ ์˜์‚ฌ ์„ ํƒ๊ธฐ์— ๋Œ€ํ•œ ์ง€์›์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์† ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๊ฐ„์— ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์‹ค์ œ ๋ณ‘๋ชฉ ํ˜„์ƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์˜ ์„ฑ๋Šฅ์ด ์ ์ค‘๋˜์—ˆ๋Š”์ง€ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.2.4 ๋ฐ 3.7.4์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์„ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ๋กœ์ปฌ์—์„œ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์›์ธ์€ 3.2.4 ์ดํ›„ ์ถ”๊ฐ€๋œ ๋ฐ”๋žŒ์งํ•œ ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๋กœ ํŒ๋ช…๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” "0s"๊ฐ€ ์˜คํƒ€๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค - ์•„๋งˆ๋„ "40s" ๋˜๋Š” "50s"?)

CSSProperties์™€ ๊ด€๋ จํ•˜์—ฌ ์†์„ฑ ์ด๋ฆ„๊ณผ ์œ ํ˜•์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ๋‹นํ•œ ์‹œ๊ฐ„ ์•ˆ์— ํ™•์ธํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์›ํ•˜๋Š” ๋ชจ์–‘์„ ์‹ค์ œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜๊ฐ€ ํ•ด๋‹น ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ๋ ๊นŒ์š”?

์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ƒ๋‹นํžˆ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์†๋„ ์ €ํ•˜๋ฅผ ์ฐจํŠธ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” "0s"๊ฐ€ ์˜คํƒ€๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค - ์•„๋งˆ๋„ "40s" ๋˜๋Š” "50s"?)

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. 50๋Œ€์ž…๋‹ˆ๋‹ค.

3.2.4 ๋ฐ 3.7.4์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์„ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ๋กœ์ปฌ์—์„œ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋™์ผํ•œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฃจํŠธ์˜ yarn typescript ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด yarn workspace @material-ui/styles run typescript ๋Š” tslint ๋ฐ dtslint ์˜ $ExpectError ์œ ํ˜•์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. 3.7.4์—์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(#19242 ์ฐธ์กฐ).

์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๋ชจ์–‘์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋งŒํผ ์˜์‹ฌํ–ˆ๋‹ค. ์ธ๋ฑ์Šค ์„œ๋ช…์ด ์žˆ๋Š” ๊ฐœ์ฒด์™€ "๊ตฌ์ฒด์ ์ธ" ๋ชจ์–‘์„ ํ˜ผํ•ฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹จ์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ๋ ๊นŒ์š”?

๋ถ„๋ช…ํžˆ. ๋‚˜๋Š” ๋น„์žฌ๊ท€ CSSProperties์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์‹œ๊ฐ„์„ ํ• ์• ํ•œ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ธˆ ๋” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ css-in-js ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์ด ๋น„์Šทํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ค์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด์ผ ๊ทธ ๋ช…๋ น์„ ์‹œ๋„ํ•  ๊ฒƒ์ด๋‹ค(๋‚˜๋Š” ๋‚ด๊ฐ€ ํƒœํ‰์–‘ ์‹œ๊ฐ„์— ์žˆ๊ณ  ๋ฏธ๊ตญ ๊ณตํœด์ผ์„ ์ค€์ˆ˜ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค).

์ธ๋ฑ์Šค ์„œ๋ช…์ด ์žˆ๋Š” ๊ฐœ์ฒด์™€ "๊ตฌ์ฒด์ ์ธ" ๋ชจ์–‘์„ ํ˜ผํ•ฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹จ์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ์ข‹์„์ง€ ๊ณ ์‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ƒ‰์ธ ์„œ๋ช…์ด ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๋ณ€ํ˜• ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์ง€๋งŒ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์กฐ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ css-in-js ์Šคํƒ€์ผ๋ง ์†”๋ฃจ์…˜์ด ๋น„์Šทํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ผ์œผํ‚ค์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ๊ทธ๋ ‡๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ „์ฒด ์ƒํƒœ๊ณ„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ํ™”๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ถ„๋ช…ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ํ˜„์žฌ ๋ง‰ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € Windows๋ฅผ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. Linux์—์„œ ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๋‘˜์งธ, yarn typescript ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊น”๋”ํ•˜๊ฒŒ - ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ํ•œ tsc๊ฐ€ ์•„๋‹Œ tslint๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ tsconfig.json์—์„œ tsc๋ฅผ ์‹คํ–‰ํ•˜๋ฉด(ํŠนํžˆ ์Šคํƒ€์ผ๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค) ~40๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ˜ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์ฃ ? ํ”„๋กœํŒŒ์ผ๋ง ๋ชฉ์ ์„ ์œ„ํ•ด repo๋ฅผ ๋‹จ์ผ tsc ํ˜ธ์ถœ๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@amcasey yarn typescript ๋Š” ์ปดํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ์œ ํ˜•์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ Typed ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. packages/* TypeScript ํŒŒ์ผ์€ ๊ฑฐ์˜ ํ•ญ์ƒ $ExpectError ํฌ์ฐฉํ•˜๋Š” ํ†ต๊ณผํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•ด์•ผ ํ•˜๋Š” ๋ช…๋ น๋ฌธ์˜ ๋ฌถ์Œ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ตœ๊ณ  "์‹ค์ œ"ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ tsc ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ๋ฌธ์„œ์— yarn workspace docs run tsc -p tsconfig.json ์ถ”๊ฐ€ ํ•œ ํ›„ skipLibCheck: true ๋ฐ noEmit: true ์— ./docs/tsconfig.json :

--- a/docs/tsconfig.json
+++ b/docs/tsconfig.json
@@ -3,6 +3,8 @@
   "include": ["types", "src/pages/**/*"],
   "compilerOptions": {
     "allowJs": false,
-    "noUnusedLocals": true
+    "noUnusedLocals": true,
+    "noEmit": true,
+    "skipLibCheck": true
   }
 }

@eps1lon ๋ช…ํ™•ํžˆ

์ด ์„ค์ •์€ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ ์‹œ๊ฐ„์ด 3.3๊ณผ 3.4 ์‚ฌ์ด์—์„œ ๋‘ ๋ฐฐ์ธ ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

| ๋ฒ„์ „ | ์‹œ๊ฐ„ ํ™•์ธ |
|-|-|
| 3.2 | 16.71์ดˆ |
| 3.3 | 16.79์ดˆ |
| 3.4 | 35.25์ดˆ |
| 3.5 | 21.40์ดˆ |
| 3.6 | 23.10์ดˆ |
| 3.7 | 27.39์ดˆ |

์กฐ๊ธˆ ๋” ํŒŒ๊ณ ๋“ค๊ฒ ์ง€๋งŒ ์กฐ๊ฑด๋ถ€ ์œ ํ˜•์˜ 3.3 ๊ตฌํ˜„์€ ๋ถˆ์™„์ „ํ•˜๊ณ  3.4 ๊ตฌํ˜„์€ ๋Š๋ฆฌ๊ณ  3.5 ๊ตฌํ˜„์€ ์–‘ํ˜ธํ•˜๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ด ๋ฒ„๊ทธ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์†๋„๊ฐ€ ๋Š๋ ค์กŒ๋‹ค๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค .

๋‚˜๋Š” 3.5์™€ 3.7 ์‚ฌ์ด์— ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด 6์ดˆ ์ฆ๊ฐ€ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ์ƒ๋‹นํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

@embeddedt ์ด ์ˆซ์ž๋Š” ๊ฐ ๋ฒ„์ „์˜ ๋‹จ์ผ ์‹คํ–‰์—์„œ ๋‚˜์˜จ ๊ฒƒ์ด๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ๋…ธ์ด์ฆˆ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ํŒŒ๊ณ ๋“ค์–ด์„œ ๋ญ”๊ฐ€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Linux VM์—์„œ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ 3.7์€ 3.5๋ณด๋‹ค ์ผ๊ด€๋˜๊ฒŒ 20-25% ๋Š๋ ธ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋นŒ๋“œ์˜ ์—ฐ์† ์‹คํ–‰์ด ~5%์”ฉ ๋‹ค๋ฅด๊ณ  3.5์™€ 3.6 ๋˜๋Š” 3.6๊ณผ 3.7 ์‚ฌ์ด์˜ ์ฐจ์ด๊ฐ€ ~10%์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ด๋“ฑ๋ถ„ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ ์€ styled-components ๊ฐ€ TS >= 3.7์— ๋Œ€ํ•ด ๋ณ„๋„์˜ .d.ts ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋น„๊ต๊ฐ€ ์‚ฌ๊ณผ์™€ ์‚ฌ๊ณผ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋†€๋ž๊ฒŒ๋„ ์ƒˆ๋กœ์šด styled-components ์œ ํ˜•์ด ๋” ๋นจ๋ผ ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ๊ณผ์™€ ์‚ฌ๊ณผ๋ฅผ ๋น„๊ตํ•˜๋ฉด ์—ฌ์ „ํžˆ ์กฐ์‚ฌ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜๋ฆฌํ•œ ์†”๋ฃจ์…˜์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„ ๋ณ‘ํ•ฉ์œผ๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋ณ‘ํ•ฉ์„ ํ”Œ๋กฏํ•˜๊ณ  ์ŠคํŒŒ์ดํฌ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‚ด์ผ ์ˆซ์ž๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@amcasey ์ด ๋ฌธ์ œ ๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์‹ ์†ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด JSS์—์„œ ์•ฝ๊ฐ„์˜ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๊ตํ™˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” Typescript ์„œ๋ฒ„๊ฐ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋”ฐ๋ผ์žก๊ธฐ๊นŒ์ง€ 8-10์ดˆ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

3ํšŒ ํ‰๊ท ์„ ๋‚ด๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋Š” ๋งค์šฐ ์‹œ๋„๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜,์—์„œ ๋Ÿฐํƒ€์ž„์— ๋„๊ฒŒ ํ•˜๋ฝ์ด์žˆ์„ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค https://github.com/microsoft/TypeScript/commit/ad322a561a301ae357da051b9221b2222c13be36 ์—์„œ ๋ˆˆ์— ๋„๊ฒŒ ์ฆ๊ฐ€ (๋Œ€๋žต ์ด์ „ ์ˆ˜์ค€์œผ๋กœ ๋Œ์•„ ๊ฐ€๊ธฐ) https://github.com/microsoft/TypeScript๋ฅผ /commit/480b73915fdd805952fd355e4cf3e1bc803e0878 ๊ทธ๋ฆฌ๊ณ  https://github.com/microsoft/TypeScript/commit/c5e6d95e9330048a ์˜ ํŠน์ • ์ŠคํŒŒ์ดํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ (๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ๊ท ์ผํ•˜๊ฒŒ ๋ณด์ด๊ณ  ํ™˜๊ฒฝ ์š”์ธ์ด ์˜์‹ฌ๋˜์ง€๋งŒ) ์ผ๋ฐ˜์ ์ธ ์ƒ์Šน ์ถ”์„ธ ๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒ์Šน ์ถ”์„ธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ์ฒ˜์Œ ๋‘ ๊ฐ€์ง€์— ์ง‘์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ชจ๋“  ์ปค๋ฐ‹์ด ์–ด๋–ป๊ฒŒ ๊ท ์ผํ•˜๊ฒŒ ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?).

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

์ปค๋ฐ‹๋‹น ์ตœ๋Œ€ 10๊ฐœ์˜ ์‹คํ–‰์„ ์˜ฌ๋ ธ๊ณ  ์ด์ œ ๊ฒฝ์‚ฌ ์˜์—ญ์— 4๊ฐœ์˜ ๋šœ๋ ทํ•œ ํšŒ๊ท€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :์›ƒ๋‹ค:

https://github.com/microsoft/TypeScript/commit/26caa3793e310e271ddee8adc1804486e5b0749f(~700ms )
https://github.com/microsoft/TypeScript/commit/250d5a8229e17342f36fe52545bb68140db96a2e(~500ms )
https://github.com/microsoft/TypeScript/commit/7ce793c5b8c621af5ce50af0ca3958c7bd6541bf(~1300ms )
https://github.com/microsoft/TypeScript/commit/28050d5c47c6cd7627555f12cf13b1062f80322a(~400ms )

(ํšŒ๊ท€๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์˜ ์ด ์‹œ๊ฐ„์€ ~33์ดˆ์˜€์Šต๋‹ˆ๋‹ค.)

๊ธฐ๋Œ€์น˜๋ฅผ ์กฐ๊ธˆ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด: ์ด๋Ÿฌํ•œ ํšŒ๊ท€ ์ค‘ ์ผ๋ถ€๋Š” ๊ฐ€์น˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์ˆ˜ํ‘œ๋กœ ํŒ๋ช…๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ˆ˜ํ‘œ๋ฅผ ๋ชจ๋‘ ๋ฌด๋ฃŒ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค ํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ 20%๋งŒ ํ• ์ธ๋ฉ๋‹ˆ๋‹ค. ".

ํŽธ์ง‘: ๋งํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ๊ฐ ํšŒ๊ท€ _before_ ๋ณ‘ํ•ฉ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@eps1lon ์ด ๋์—์„œ ๋ˆ„๊ตฐ๊ฐ€ @ts-ignore ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์ตœ์šฐ์„  ์ˆœ์œ„๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ข‹์€ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์ดํ›„์— ์‚ญ์ œ๋˜๋ฉด( @ts-ignore ์ธํ•ด) ๊ทธ ์‹œ๊ฐ„์€ ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค. (๋ถˆํ–‰ํžˆ๋„ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ๋Œ€์•ˆ ์ „๋žต์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰์„ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ๋ช…์‹œ์  ์œ ํ˜• ์ฃผ์žฅ( any )์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@eps1lon ์ด ๋์—์„œ ๋ˆ„๊ตฐ๊ฐ€ @ts-ignore ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

docs/ ์—์„œ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŒ์ผ์˜ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ–ˆ๋‹ค: #19504

์†”์งํžˆ ๋งํ•ด์„œ @ts-ignore ์ด ๊ฒฝ์šฐ์—๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ @ts-ignore ๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ ์ค‘์ธ .js ํŒŒ์ผ์—์„œ๋งŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ , PR ๊ฐœ์„  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์ด์œ ๋ฅผ ๊ฑฐ์˜ ํ™•์‹คํžˆ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ™•์‹คํžˆ ๊ฐœ์„ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์„ฑ๋Šฅ์„ ํšŒ๊ท€ํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ฒ„๊ทธ:
https://github.com/microsoft/TypeScript/issues/36562
https://github.com/microsoft/TypeScript/issues/36564
https://github.com/microsoft/TypeScript/issues/36565
https://github.com/microsoft/TypeScript/issues/36566
https://github.com/microsoft/TypeScript/issues/36567

๊ณต์ •ํ•œ ๊ฒฝ๊ณ : ์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ €๋Š” TypeScript์˜ ์„ธ๊ณ„, ํŠนํžˆ JS ์Šคํƒ€์ผ ์†”๋ฃจ์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งค์šฐ ์ต์ˆ™ํ•˜์ง€๋งŒ ์ง€๋‚œ ํ•œ ๋‹ฌ ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์กฐ์šฉํžˆ ๋”ฐ๋ผ๊ฐ”๊ณ  ์ž ์žฌ์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ƒ๊ฐ์„ ๋“ฃ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๋‹จ๊ธฐ์ ์œผ๋กœ๋Š”.

๋‚˜๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ์ž(๋‚˜ ์ž์‹ ์ด ํ•˜๋‚˜์ž„)๊ฐ€ ๋‚ด์žฅ๋œ ์Šคํƒ€์ผ๋ง ์‹œ์Šคํ…œ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์™„์ „ํžˆ ํ”ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ์ผ๋ฐ˜ CSS ๋˜๋Š” Sass์— ํ›จ์”ฌ ๋” ์ต์ˆ™ํ•˜๊ณ  JS ์Šคํƒ€์ผ๋ง ์‹œ์Šคํ…œ์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŒŒํ—ค์น  ์‹œ๊ฐ„์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚˜๋งŒ์˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋งŒ๋“ค๊ณ , ๋ณ„๋„์˜ ์Šคํƒ€์ผ์‹œํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ , React ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์˜ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €๋Š” ์ผ๋ฐ˜ HTML์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์Šคํƒ€์ผ๋ง ์‹œ์Šคํ…œ์˜ ๊ฐ’๋น„์‹ผ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ/์‹ค์šฉ์ ์ž…๋‹ˆ๊นŒ( type CSSProperties = any ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์กฐ๊ฑด๋ถ€๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ)? ์Šคํƒ€์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํฐ ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. , ์ตœ์†Œํ•œ ํ•œ ์‚ฌ์šฉ์ž ์„ธ๊ทธ๋จผํŠธ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Œ๊ป ์˜์„ธ์š”. :์•ฝ๊ฐ„_์›ƒ๋Š”_์–ผ๊ตด:

@embeddedt ์ผ๋ฐ˜์ ์œผ๋กœ any ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ ์ด์ „ ์„ ์–ธ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ค‘๋ณต ์„ ์–ธ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์ด ํ•„์š”ํ•œ์ง€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ˆ˜์น˜(๋‹ค๋ฅธ ๊ธฐ๊ณ„, ๋‹ค๋ฅธ ์‹œ๊ฐ„ ์ธก์ •๋ฒ•):

| ๋ฒ„์ „ | ์ด ์‹œ๊ฐ„ |
|-|-|
| 3.5.3 | 32.5์ดˆ |
| 3.7.5 | 35.9์ดˆ |
| ๋งˆ์Šคํ„ฐ | 29.9์ดˆ |

์œ„์— ๊ฒŒ์‹œํ•œ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋Š” ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ 3.5 perf(์ด ๋ฒค์น˜๋งˆํฌ์˜ ๊ฒฝ์šฐ)๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆฌ์ง€๋งŒ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ material-ui ์ชฝ์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ 3.8.1์„ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ 3.2.4๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์ „ ๋ฒ„์ „๋งŒํผ ๋น ๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(3.7์€ ์ƒ๋‹นํžˆ ๋Š๋ฆผ).

์†”์งํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์„ฑ๊ณผ๋ฅผ ๋˜์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :smile: ์ข€ ๋” ์—ฌ์œ ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: https://github.com/microsoft/TypeScript/pull/36754). ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ๋ณ€๊ฒฝ์€ CSSProperties ์œ ํ˜•์˜ ๋‹จ์ˆœํ™”์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ๋†€ ๊ธฐํšŒ๊ฐ€ ์ „ํ˜€ ์—†์—ˆ์Šต๋‹ˆ๊นŒ? ์ ์–ด๋„ ์ผ๋ถ€ ์‚ฌ์šฉ์ž(์˜ˆ: @embeddedt)๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ๋Œ€๊ฐ€๋กœ ์ผ๋ถ€ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ธฐ๊บผ์ด ํฌ๊ธฐํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ ์ผ๋ถ€ ์‚ฌ์šฉ์ž(์˜ˆ: @embeddedt)๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ๋Œ€๊ฐ€๋กœ ์ผ๋ถ€ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ธฐ๊บผ์ด ํฌ๊ธฐํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TS ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ตœ๊ทผ์— ๋” ์—„๊ฒฉํ•œ ์œ ํ˜•์„ ์›ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋Š์Šจํ•œ ์œ ํ˜•์„ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ํŠธ์œ—ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? :์›ƒ๋‹ค:

๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์œ ํ˜• ๊ฒ€์‚ฌ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค(๋ธŒ๋ผ์šฐ์ € devtools๋Š” CSS๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ "๋ฒ„์ „"์„ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@amcasey CSSProperties (styled-components์—์„œ CSSObject๋ผ๊ณ  ํ•จ)์˜ ์žฌ๊ท€์  ํŠน์„ฑ์ด ์ฃผ์š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋“ค์˜ ์„ฑ๋Šฅ์ด ์šฐ๋ฆฌ๋งŒํผ ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/eps1lon/mui-types-perf/pull/6 ๋ฐ ๋ฒค์น˜๋งˆํฌ ๋กœ๊ทธ๋ฅผ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค .

์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” "๊ณผ๋ถ€ํ•˜"์˜ ์–‘์— ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. styled-components ๋Š” ์ฝํฌ ๋ฒ„์ „๊ณผ ๊ฐ ์†์„ฑ์ด ์ฝํฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๋™์•ˆ ์ •์  ๊ฐœ์ฒด๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์„œ๋ช…์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‹ถ์ง€๋งŒ(๊ฐœ๋ฐœ์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด IMO์ด๊ธฐ ๋•Œ๋ฌธ์—) JSS ๊ตฌํ˜„๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ง€์›ํ•˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋“์ด 20% ์˜์—ญ์— ์žˆ๋Š” ๊ฒฝ์šฐ. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŒŒ์†์„ ์ •๋‹นํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์„ ์กฐ๊ฑด๋ถ€๋กœ ๋œ ์ •ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์‚ฌ์šฉ์ž ์„ค์ •์— ๋”ฐ๋ผ)? ์ด๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ(๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •์ด ํ•ด์ œ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ๋ณต์žกํ•œ ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‚˜์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€์กฐ์ฐจ ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 15%์˜ ์„ฑ๋Šฅ ์Šน๋ฆฌ๋ฅผ ๋ณด์•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์ธ์‹ ๊ฐ€๋Šฅํ•œ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” "์‚ฌ์šฉ์ž ์„ค์ •"์€ ์„ค์น˜ํ•  ๋•Œ ํŒจํ‚ค์ง€๋ฅผ ํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ํƒ€์ดํ•‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์—ญํญ์ด ์—†์Šต๋‹ˆ๋‹ค.

@eps1lon ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ ์งˆ๋ฌธ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” CSSProperties ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋ฌผ๋ก  ๋” ์ž‘์œผ๋ฉด ๋” ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค) - ์‹ค์ œ๋กœ https://github.com/mui-org ์—์„œ ํ•˜์œ„ ์œ ํ˜•์„ ๋‹จ์ˆœํ™”ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜• ์„ any ๋ณ€๊ฒฝ ํ•˜๋ฉด ์™„๋ฃŒ ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๋‚ด ์ƒ์ž์—์„œ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด docs ํ”„๋กœ์ ํŠธ๋ฅผ 15% ๋” ๋น ๋ฅด๊ฒŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(29.7์ดˆ์—์„œ 25.5์ดˆ๋กœ) ํŽธ์ง‘ ํ™˜๊ฒฝ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘ 2: ์‹ค์ œ๋กœ ์œ ํ˜•์˜ ์žฌ๊ท€ ๋ถ€๋ถ„์—์„œ ์ ‘๊ธฐ๋ฅผ ํฌ๊ธฐํ•˜๋ฉด BaseCreateCSSProperties ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์†์„ฑ์€ any ์œ ํ˜•์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์ฆ‰, CSS ์†์„ฑ์˜ ์‹ค์ œ ์œ ํ˜•).
ํŽธ์ง‘ 3: ํŽธ์ง‘ 2๋Š” ๊ณผ๋„ํ•œ ์†์„ฑ ๊ฒ€์‚ฌ๋กœ ์ธํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ฆ‰, ์ž„์˜์˜ ์†์„ฑ ์ด๋ฆ„์€ ๊ฐœ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ).

์™„๋ฃŒ ๋Œ€ ์œ ํ˜• ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์€ ์ผ๋ถ€ ์œ ํ˜• ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์„ค์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค. @DanielRosenwasser "a" | "b" | string ํŒจํ„ด์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ styled-components ์—๋Š” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๊ฒ€์‚ฌ๊ธฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ https://github.com/microsoft/TypeScript/issues/36782๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค

emotion ์ด(๊ฐ€) ๊ฐ™์€ ๋ณดํŠธ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚ด ํ”„๋กœ์ ํŠธ์— Material UI( 4.9.4 )๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. withStyles() ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜๋œ ๊ฐ„๋‹จํ•œ <Slider/> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” IDE์˜ ์ฆ‰๊ฐ์ ์ธ TypeScript ํ”ผ๋“œ๋ฐฑ์—์„œ ๋•Œ๋•Œ๋กœ 5-10์ดˆ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๊ฒƒ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ง€๊ธˆ Material UI์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ - ๊ตฌ์„ฑ ์š”์†Œ). ์ด๋Ÿฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ญ”๊ฐ€ ํฌ๊ฒŒ ์ž˜๋ชป๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค). @amcasey ๊ฐ€ ์ข‹์€ ์กฐ์‚ฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ @material-ui ๋Œ€ํ•œ ๋ชจ๋“  TypeScript ํ•ญ๋ชฉ์„ ์ตœ์†Œํ•œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ๋ชจ๋“ˆ any ). ํ•˜์ง€๋งŒ TypeScript๋Š” ๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@lostpebble withStyles ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šฌ๋ผ์ด๋”๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ๋•Œ๋„ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ(์˜ˆ: CSS ๋ชจ๋“ˆ)?

@lostpebble ํ˜„์žฌ ํŠน์ • ์œ ํ˜• ์ง‘ํ•ฉ์„ ์ œ์™ธํ•˜๋Š” ์ง€์›๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ •๋ง๋กœ ์ •๋ง๋กœ ์›ํ•œ๋‹ค๋ฉด ์‹คํ—˜ํ•  ๊ฒƒ์€ ๊ฒฝ๋กœ ๋งคํ•‘์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "@material-ui/*": ["simplemui"] ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ ๋งคํ•‘์„ ์‹œ๋„ํ•œ ๋‹ค์Œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” simplemui.d.ts ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

declare const x: any;
export = x;

๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  material-ui ์œ ํ˜•์ด ํšจ๊ณผ์ ์œผ๋กœ any ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ํ•ดํ‚น์ด๋ฉฐ ๋‚ด๊ฐ€ ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํŽธ์ง‘ ๊ฒฝํ—˜์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ (30% ์˜์—ญ์—์„œ) ์ข‹์€ ๊ฐœ์„ ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ํƒ€์ดํ•‘์„ ๋” ๋Š์Šจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์–ด๋–ค ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์— ์˜ํ•ด ์ˆ˜๋ฝ๋  ์ˆ˜ ์žˆ๋Š”์ง€์™€ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ  ์ด๊ฒƒ์ด ์˜๋ฏธ ์žˆ๋Š” ์›€ํ‘น ๋“ค์–ด๊ฐ„ ๊ณณ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜๋„์ ์œผ๋กœ ๋„์ž…๋œ ํšŒ๊ท€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๋น„์ž์—๊ฒŒ ์ด๊ฒƒ์„ ์„ค๋ช…ํ•ด์•ผ ํ•˜๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ์ƒ๋‹นํžˆ ์ŠคํŠธ๋ ˆ์Šค๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋งŽ์€ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์€ ํ˜„์žฌ ๋‚˜์—๊ฒŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„์ฃผ ์ ์€ ์ˆ˜์ต์— ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

makeStyles(theme => createStyles(...)) ๊ฒฝ์šฐ Record<ClassKey, any> ์—์„œ createStyles(...) ๊ฑฐ์˜ ~์ ˆ๋ฐ˜~ (๋‚ด ์ฝ”๋“œ์™€ ์ปดํ“จํ„ฐ์—์„œ ์•ฝ ~1200ms -> 750ms~ 1400ms โ†’ 1100ms) encodedSemanticClassifications-full: elapsed time ๋Š” tsserver ๋กœ๊ทธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์€ ์•„๋‹ˆ์ง€๋งŒ ์•„๋งˆ๋„ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

export default function createStyles<ClassKey extends string, Props extends {}>(
  styles: StyleRules<Props, ClassKey>,
): Record<ClassKey, any>;

createStyles(...) ๋Š” ์Šคํƒ€์ผ ๊ตฌ์กฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฏ€๋กœ makeStyles์˜ ๋Œ€๊ทœ๋ชจ ํ†ตํ•ฉ ์ธ์ˆ˜ ์œ ํ˜• ๋Œ€ createStyle์˜ ๋Œ€๊ทœ๋ชจ ํ†ตํ•ฉ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

~(์ „์ฒด makeStyles ์ฝ”๋“œ ์ฃผ์„ ์ฒ˜๋ฆฌ: 650ms)~

@ypresto createStyles ๋Š” const ์–ด์„ค์…˜์ด ์—†๋Š” typescript ๋ฒ„์ „์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ { display: 'block' as const } ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด(ts >= 3.4) createStyles .

@eps1lon ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ฆฌ๊ณ  docs ์—์„œ ์ „ํ™˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ์ธ์ƒ์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@eps1lon with const ๋ฐ createStyles , IntelliSense๋Š” ๋” ์ด์ƒ ์ปจํ…์ŠคํŠธ ์ธ์‹ ํ›„๋ณด๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .cry :

@ypresto ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@์•”์ผ€์ด์‹œ

์™ธ๋ถ€ ๊ฐœ์ฒด ๋˜๋Š” ์†์„ฑ์— as const ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ๋ถ€๋™์‚ฐ์— ๊ทธ๊ฒƒ์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

const useStyles = makeStyles(theme => ({
  root: {
    // no IntelliSense
  }
} as const))

๋˜ํ•œ createStyles๊ฐ€ ์—†์œผ๋ฉด ๋ฌธ์ž์—ด ์™„์„ฑ์— ์•ฝ๊ฐ„์˜ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const useStyles = makeStyles(theme => ({
  root: {
    direction: '|', // no IntelliSense at | (works with createStyles)
    direction: | // IntelliSense works at |
  }
}))

@ypresto "์ฃฝ์ธ๋‹ค"๋Š” ๋ง์€ " createStyles ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•จ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์–ด๋””์—๋‚˜ ๋‘๋Š” ๊ฒƒ์€ ํž˜๋“ค์ง€๋งŒ createStyles ์–ด๋””์—๋‚˜ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋Œ๋ฆฌ๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

@amacleay ๋‚˜๋Š” kills IntelliSense : ๊ธฐ๋„:.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ด๊ฒƒ์€ 1100ms โ†’ 750ms์ž…๋‹ˆ๋‹ค.

 export const DropArea: React.FC<CardProps & {
   active?: boolean
   description: string
   icon?: React.ReactNode
-}> = ({ active, description, icon, children, ...props }) => {
+}> = ({ children, ...props }) => {
   const classes = useStyles()
+  const active = false
+  const icon: React.ReactNode = null
+  const description = ''
   return (
     <Card {...props} className={clsx(classes.root)} variant="outlined">

FC์—์„œ CardProps & ๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ CardProps๊ฐ€ ํฐ HTMLAttributes๋ฅผ ํ™•์žฅํ•˜๋Š” PaperProps๋ฅผ ํ™•์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ๋ฐ ์ค‘์š”: CardProps๋ฅผ HTMLAttributes<HTMLDivElement> ๊ต์ฒดํ•˜๋ฉด ์‹œ๊ฐ„๋„ ๋‹จ์ถ•๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค(์ธก์ •๋˜์ง€ ์•Š์Œ).

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. 750ms โ†’ 130ms:

๋‘ ๊ฐœ์˜ ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ์—์„œ style={...} ์ œ๊ฑฐ.

-<Typography variant="subtitle2" component="div" noWrap style={{ width: '26ch' }}>...</Typography>
+<Typography variant="subtitle2" component="div" noWrap>...</Typography>
-<Typography variant="caption" component="div" noWrap style={{ width: '20ch' }}>...</Typography>
+<Typography variant="caption" component="div" noWrap>...</Typography>

ํ•˜์ง€๋งŒ ์™œ? <div> ๊ฐ™์€ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด๋„ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OverridableComponent ๋„ˆ๋ฌด ๋ณต์žกํ•œ๊ฑฐ ์•„๋‹๊นŒ์š”..?

(์ €๋Š” TypeScript 3.8.3, @material-ui/core 4.9.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

Material-UI๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋กœ์ปฌ ์Šคํƒ€์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” AFAIK ๋ฐฉ์‹์€ React๊ฐ€ HTML ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@embeddedt ์œ ํ˜• ์ˆ˜์ค€์—์„œ div์˜ ์Šคํƒ€์ผ ์†Œํ’ˆ๊ณผ ๋™์ผํ•œ React.CSSProperties ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

@ypresto ์ •์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ์ด์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ ํ˜• ์ •ํ™•์„ฑ/์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.
์‚ฌ์šฉ์ž ์ •์˜ ๊ธ€๊ผด์„ ์ถ”๊ฐ€ ํ•˜๊ธฐ ์œ„ํ•ด
Type 'string' is not assignable to type 'FontFaceFontDisplayProperty'

csstype 2.6.9 ์ž…๋ ฅ์ด ์œ ํšจํ•˜๊ณ  ๋‹ค๋ฅธ ์†์„ฑ์€ ์ •์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•ฉ๋‹ˆ๋‹ค(MUI 4.9.5 ์‚ฌ์šฉ).

const sourceSansPro = {
  fontFamily: "'Source Sans Pro'",
  fontStyle: "normal",
  fontDisplay: "swap", // won't work
  fontWeight: 400,
  src: `
    url('/static/fonts/Source_Sans_Pro/SourceSansPro-Regular.ttf') format("truetype")
  `
};

ํ…Œ๋งˆ ์†์„ฑ:

  overrides: {
    MuiCssBaseline: {
      "@global": {
        "@font-face": [sourceSansPro]
      }
    }

์œ ํ˜•์€ type FontFaceFontDisplayProperty = "auto" | "block" | "fallback" | "optional" | "swap";

@eric-burel ์ด๊ฒƒ์€ typescripts์˜ ์ž๋™ ์œ ํ˜• ํ™•์žฅ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋…ธ๋ ฅํ•˜๋‹ค

- fontDisplay: "swap", // won't work
+ fontDisplay: "swap" as "swap",

๋•๋ถ„์— ์ž‘๋™ํ•˜๊ณ  "์œ ํ˜• ํ™•์žฅ"์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค :) ์˜ˆ๋ฅผ ๋“ค์–ด fontStyle ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์œผ๋กœ ์ •์˜๋œ ์œ ์ผํ•œ CSS ์†์„ฑ์ด ์•„๋‹ˆ๋ผ ์ฒ˜์Œ์œผ๋กœ ์ด๊ฒƒ์„ ์ณค์„ ๋•Œ .

ํŽธ์ง‘: ์ข‹์•„, ์ž˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: https://material-ui.com/guides/typescript/#using -createstyles-to-defeat-type-widening

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. 750ms โ†’ 130ms:

๋‘ ๊ฐœ์˜ ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ์—์„œ style={...} ์ œ๊ฑฐ.

-<Typography variant="subtitle2" component="div" noWrap style={{ width: '26ch' }}>...</Typography>
+<Typography variant="subtitle2" component="div" noWrap>...</Typography>
-<Typography variant="caption" component="div" noWrap style={{ width: '20ch' }}>...</Typography>
+<Typography variant="caption" component="div" noWrap>...</Typography>

ํ•˜์ง€๋งŒ ์™œ? <div> ๊ฐ™์€ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•ด๋„ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. OverridableComponent ๋„ˆ๋ฌด ๋ณต์žกํ•œ๊ฑฐ ์•„๋‹๊นŒ์š”..?

(์ €๋Š” TypeScript 3.8.3, @material-ui/core 4.9.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

์ด๊ฒƒ์ด ๋นŒ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋‚˜ Intellisense๊ฐ€ ์œ ์šฉํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๊นŒ? ๋นŒ๋“œ ๋ฌธ์ œ(๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ)๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ผ๋ถ€ TS ์ฝ”๋“œ์—๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋งŽ์€ style={someStyle} ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ ๋ฌธ์ œ์˜ ์ผ๋ถ€์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@yatrix7 , ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด ์ด๋Ÿฌํ•œ ๊ธด ๊ฒ€์‚ฌ ์‹œ๊ฐ„์ด ๋นŒ๋“œ ๋ฐ ํŽธ์ง‘๊ธฐ ์‘๋‹ต ์‹œ๊ฐ„์— ๋ชจ๋‘ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ „ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ์—์„œ typescript ์œ ํ˜• ํ™•์ธ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.
์ด๊ฒƒ์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ์Šค์Šค๋กœ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๊บผ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์กฐ์‚ฌ์— ๋„์›€์ด ๋˜๋„๋ก ํ˜„์žฌ ๋ช‡ ๊ฐ€์ง€ ๋ฒค์น˜๋งˆํ‚น์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/mui-org/material-ui/pull/22110

@FabianKielmann TS ์ชฝ์—์„œ ๋‚˜๋Š” ๋จธํ‹ฐ๋ฆฌ์–ผ UI์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ณง ์„ฑ์ˆ™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ์„ฑ๋Šฅ ์กฐ์‚ฌ ๋„๊ตฌ๋ฅผ ์ž‘์—…ํ•ด ์™”์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ์‹œ๊ฐ„์„ ํ• ์• ํ•œ๋‹ค๋ฉด https://github.com/microsoft/TypeScript/issues/38583 ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค

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