Typescript: ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›

์— ๋งŒ๋“  2017๋…„ 03์›” 02์ผ  ยท  99์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

#13764๊ฐ€ ์ถœ์‹œ๋œ ์ดํ›„๋กœ ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ API๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋‹จ์ผ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด tsc ๋ช…๋ น์ค„์„ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” typescript์— ๋”ฐ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด tsc ๋ช…๋ น์ค„ ๋„๊ตฌ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ˜ธํ™˜์„ฑ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์–ธ์–ด ์„œ๋น„์Šค ํ”„๋ก์‹œ #12231์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํƒ€์‚ฌ ๋…ธ๋“œ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜๊ธฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜๊ธฐ๋Š” ๊ธฐ์กด ๋นŒ๋“œ ๋„๊ตฌ/๋นŒ๋“œ ์›Œํฌํ”Œ๋กœ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” PR์„ ๋งŒ๋“ค ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋…ธ์ถœ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ API๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  TS-Compiler API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  tsconfig.json์— ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. TS-Compiler API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ tsc ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๊ธฐ์กด ๋นŒ๋“œ ๋„๊ตฌ ๋ฐ ์›Œํฌํ”Œ๋กœ์— ์ œ๋Œ€๋กœ ํ†ตํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๋‹จ๊ธฐ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ณต๊ฐœํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ๊ณต๊ฐœ API์˜ ์ผ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋ฉฐ ์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ์™€ ์ƒ˜ํ”Œ์„ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

๋…ธ์ถœ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ API๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  TS-Compiler API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  tsconfig.json์— ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. TS-Compiler API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ tsc ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ๊ธฐ์กด ๋นŒ๋“œ ๋„๊ตฌ ๋ฐ ์›Œํฌํ”Œ๋กœ์— ์ œ๋Œ€๋กœ ํ†ตํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ๋ฐ ์ƒ˜ํ”Œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? @mhegazy

@MichaReiser API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ„๋‹จํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ƒ˜ํ”Œ ์—ฌ๊ธฐ ). ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์•ผํ›„ ํŒŒ์ด๋‚ธ์Šค ๋‚ด์—์„œ TS๋ฅผ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ ํŠธ๋žœ์Šคํฌ๋จธ ๊ณต๊ฐœ API๋Š” ํ›Œ๋ฅญํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ณต๊ฐœ๋œ ํ›„ ์ž‘์„ฑํ•œ ๋ณ€ํ™˜๊ธฐ ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
https://github.com/longlho/ts-transform-system-import
https://github.com/longlho/ts-transform-img
https://github.com/longlho/ts-transform-react-intl
https://github.com/longlho/ts-transform-css-modules-transform

์ƒ˜ํ”Œ ๋ฌธ์„œํ™”/์ˆ˜์ง‘์— ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ @mhegazy lmk

@longlho
์ƒ˜ํ”Œ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ํŒฉ ๋กœ๋”, jest ๋กœ๋”์™€ ๊ฐ™์ด typescript์šฉ์œผ๋กœ ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์šฐ๋ฆฌ ๊ฐ์ž๊ฐ€ ๋‹ค๋ฅธ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ํ˜„์žฌ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ข‹์€ ์‹œ์ž‘์ด์ง€๋งŒ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„์—๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ณ  ์ž‘์„ฑ์ž๋ฅผ ์œ„ํ•œ ๋ณ€ํ™˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๋„๋ก ์žฅ๋ คํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๋ฉด Babel๊ณผ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์ด typescript์— ํ•„์ˆ˜์ ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@MichaReiser ๋„ค . ์ƒํƒœ๊ณ„์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒํƒœ๊ณ„๋ฅผ ํ–ฅํ•œ ์ฒซ ๊ฑธ์Œ์„ ๋‚ด๋”›๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

gulp-typescript์˜ ๋ณ€ํ™˜ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ชจ๋“  TypeScript ํ”Œ๋Ÿฌ๊ทธ์ธ(gulp, webpack ๋“ฑ)์ด ๋‹ค๋ฅธ API๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TypeScript๋Š” ๋‚˜์ค‘์— ์ด๊ฒƒ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„์žฌ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…• ๋ชจ๋‘, ๋‚˜๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค :[

์‚ฌ์‹ค ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ž์—ด์—์„œ AST ์กฐ๊ฐ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•?
// 1. Input
class Foo {
    templateString = 'some value';
}

// 2. After transformation
import __LIB__ from '@external/lib';

class Foo {
    templateString = (function compiledTemplate(deps) {
        // ...
        return result;
    })({lib: __LIB__});
}

// 3. Expected result
var lib_1 = require("@external/lib");
var Foo = (function () {
    function Foo() {
        this.templateString = (function compiledTemplate(deps) {
            // ...
            return result;
        })({ lib: lib_1 }); 
    }
    return Foo;
}());

๋‹จ์ˆœํ™”๋œ ์˜ˆ: https://github.com/RubaXa/typescript-api-questions/tree/master/import-add

โฌ†๏ธ โฌ†๏ธ โฌ†๏ธ
@longlho , @mhegazy ํžŒํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@RubaXa ๋ณ€ํ™˜์— ๊ฐ€์ ธ์˜ค๊ธฐ ์„ ์–ธ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ๋ฐ”์ธ๋”ฉ๋˜๊ฑฐ๋‚˜ ์œ ํ˜•์ด ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์œ ํ˜•์ด ํ™•์ธ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„์‹์˜ __LIB__ ๋ฅผ ์„ ์–ธ์˜ __LIB__ ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

import * as __LIB__ from "@external/lib"

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์•จ๋ฆฌ์–ด์‹ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ฒจ๋ถ€๋œ zip ์— ๋”ฐ๋ผ ์ˆ˜์ž… ์„ ์–ธ์„ ์œ„ํ•ด ์ƒ์„ฑ๋œ ์‹๋ณ„์ž๋ฅผ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.

@RubaXa ๋ชฉํ‘œ๊ฐ€ ์ „์ฒด ๋ชจ๋“ˆ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด import * as __LIB__ from "@external/lib" ๊ตฌ๋ฌธ(์•จ๋ฆฌ์–ด์‹ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ)์„ ์‚ฌ์šฉํ•˜๊ณ  ํ›„์ž๊ฐ€ import __LIB__ from "@external/lib" default ์ „์ฒด ๋ชจ๋“ˆ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹Œ

์˜ˆ, ์šฐ๋ฆฌ๋Š” ์•จ๋ฆฌ์–ด์‹ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CSS ๋ชจ๋“ˆ ๋ณ€ํ™˜๊ธฐ ์—์„œ๋„ import * as foo ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ช…๋ช…๋œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ธ๋ผ์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ

@rbuckton O, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋ฌธ์ž์—ด์—์„œ ์ž„์˜์˜ AST ์กฐ๊ฐ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ์—ฌ์ „ํžˆ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?

function createFragmentFromString(code: string) {
  // ????
}

function visitPropertyDeclaration(node) {
    if (ts.isIdentifier(node.name) && node.name.text === "templateString") {
        // ...
        return ts.updateProperty(
            node,
            ts.visitNodes(node.decorators, visitor),
            ts.visitNodes(node.modifiers, visitor),
            ts.visitNode(node.name, visitor),
            ts.visitNode(node.type, visitor),
            createFragmentFromString('(function compiledTemplate() { /* ... */ })()')
        );
    }
    return node;
}

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ TypeScript์—์„œ์™€ ๊ฐ™์ด ๋ณ€์••๊ธฐ ์ง€์› ๋ฐ ์›Œํฌํ”Œ๋กœ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://www.dartlang.org/tools/pub/transformers

์ €๋„ ์ด ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

@MichaReiser๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด
If someone experienced has inputs on how to implement the changes, I'm willing to create a PR as it would simplify my project tremendously.

์ „๋ฌธ๊ฐ€/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ DEV์˜ ์ž…๋ ฅ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ž˜ํ•‘ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/cevek/ttypescript

๋˜ํ•œ ts-loader์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค: https://www.npmjs.com/package/ts-loader#getcustomtransformers -----before-transformerfactory--after-transformerfactory----

์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด typescript 2.8 ๋ฆด๋ฆฌ์Šค๋‚˜ ์ ์–ด๋„ ๋กœ๋“œ๋งต์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @ahejlsberg @mhegazy @DanielRosenwasser ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”? ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งž์ถคํ˜• ๋ณ€์••๊ธฐ๋Š” ๋” ๋Œ€์ค‘์ ์ด๊ณ  ๋”ฐ๋ผ์„œ ๋” ๊ฐ•๋ ฅํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tsconfig.json ๊ด€์ ์—์„œ ๋ณ€ํ™˜๊ธฐ์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์‚ถ์ด ๋งŽ์ด ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค.

์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‹จ๊ธฐ๊ฐ„์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ณต๊ฐœํ•  ๊ณ„ํš์€ ์—†์Šต๋‹ˆ๋‹ค.

@mhegazy ๊ณ ๋ ค๋œ ๊ฒฐ์ •์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ด€์‹ฌ์ด ๋‚ฎ๋‹ค๋Š” ์ด์œ ๋กœ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜์ง€ ์•Š์•˜์–ด. ์šฐ๋ฆฌ๋Š” ์ž‘์€ ๊ณต๊ฐœ API/์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ๊ณผ ๋นŒ๋“œ ์ง„ํ–‰ ๋ฐฉ์‹ ๋ณ€๊ฒฝ์˜ ์œ ์—ฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋ธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋ณ€ํ™˜๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ API ์กฐ๊ฐํ™”๋ฅผ ์ค‘์ง€ํ•˜์‹ญ์‹œ์˜ค. Transformer api ์œ„์— ํ”Œ๋Ÿฌ๊ทธ์ธ api๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  tsconfig.json์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ts-loader , parcel-plugin-typescript , rollup-plugin-typescript2 , ts-transformer-keys , ttypescript ๋ฐ ๊ธฐํƒ€.

๊ฐ๊ฐ ์‚ฌ์šฉ์ž ์ •์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ๋ก ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง„์ž…์  ํ˜•์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์˜ฅ์œผ๋กœ ๊ฐ€๋Š” ๊ธธ์ž…๋‹ˆ๋‹ค.

์ด์ œ cevec/ttypescript ๋Š” ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  typescript ๋ชจ๋“ˆ๊ณผ tsc, tsserver ๋ช…๋ น(์ž‘์€ ๋Ÿฐํƒ€์ž„ ts.createProgram ํŒจ์น˜) ์œ„์— ์žˆ๋Š” ๋“œ๋กญ์ธ ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. Webpack ts-loader ๋ฐ rollup-plugin-typescript2๋Š” ttypescript๋กœ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TTypescript๋Š” ๋ฒ”์šฉ ๋ณ€ํ™˜๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•์‹์„ ์ œ์•ˆํ•˜์ง€๋งŒ ๊ธฐ์กด ๋ณ€ํ™˜๊ธฐ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

{
    "compilerOptions": {
        "plugins": [
            { "transform": "ts-transform-graphql-tag" },
            { "transform": "ts-transform-css-modules", "type": "config" },
            { "transform": "ts-nameof", "type": "raw", "after": true}
            { "transform": "./transformers/my-transformer.ts", "someOption1": 123, "someOption2": 321  }
        ]
    },
    "exclude": ["node_modules", "transformers/**/*"]
}

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

๊ทธ๋“ค์€ ๋‚ด๋ถ€์—์„œ ๋ฌธ์ œ๋ฅผ ๊นจ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„๊นŒ๋ด ๋‘๋ ค์›Œ ๋‹ค๋ฅธ API/ํ‘œ๋ฉด์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์†”๋ฃจ์…˜์€ ts-team์˜ ํ‘œ์ค€์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋ฉฐ ๊ฒฐ๊ตญ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋‚ด๋ถ€์—์„œ ๋ฌธ์ œ๋ฅผ ๊นจ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„๊นŒ๋ด ๋‘๋ ค์›Œ ๋‹ค๋ฅธ API/ํ‘œ๋ฉด์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3๋…„ ๋™์•ˆ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์—…ํ•˜๊ณ  ์ง„ํ™”๋ฅผ ์ง€์ผœ๋ณธ ๊ฒฐ๊ณผ ๊ฐ„๋‹จํ•œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. Microsoft๋Š” _code_์˜ ์˜๋ฏธ์—์„œ Typescript๋ฅผ ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ _process_์˜ ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋Š” ์˜์‚ฌ ๊ฒฐ์ • ๊ณผ ์ฝ”๋”ฉ ๋ชจ๋‘์—์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฃผ๋„์ ์ด๋ฉฐ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ „ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. node.js์˜ IO.js ํฌํฌ๋ฅผ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํšŒ์‚ฌ์˜ ์ด์ต์ด ์ผ๋ฐ˜์ ์ธ ์˜คํ”ˆ ์†Œ์Šค ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ  ๋‹จ์ˆœํžˆ ๋ถ„๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. TypeScript์—์„œ๋Š” ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Microsoft๋Š” ์ด ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋“ค์€ ํ›Œ๋ฅญํ•œ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ๋‚ด 2c, OT์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

Microsoft๋Š” ์ฝ”๋“œ ์ธก๋ฉด์—์„œ Typescript๋ฅผ ์˜คํ”ˆ ์†Œ์Šค๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค ์ธก๋ฉด์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” Microsoft์—์„œ ์ผํ•œ ์ ์ด ์—†์ง€๋งŒ ์ง€๋‚œ 4๋…„ ๋™์•ˆ TypeScript์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค. ์ €๋Š” TypeScript๋กœ ๊ตฌ์ถ•๋œ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ€ํ‘œํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ง์ ‘์ ์ธ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ชจ๋“  "ํ† ๋ก "์€ ์—ฌ๊ธฐ์—์„œ ๊ณต๊ฐœ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ ๋””์ž์ธ ํšŒ์˜ ๋…ธํŠธ๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋‚ด๊ฐ€ ์–ป์€ ์œ ์ผํ•œ "๋‚ด๋ถ€์ž"๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋‚ด ์ฃผ์žฅ์„ ์ง์ ‘ ์ฃผ์žฅํ•˜๊ณ  ํ•ต์‹ฌ ํŒ€์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜€์Šต๋‹ˆ๋‹ค. ํŒ€์ด ํŒ€๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ Anders๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ง๋ฉดํ•œ "์‹ค์ œ" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ 2๋…„ ์ „์ด์—ˆ๊ณ  TypeScript 3.0์—์„œ ๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๋””์ž์ธ ๊ณผ์ •์—์„œ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ํŒ€๋„ ๋ชจ๋‘๋ฅผ ๊ธฐ์˜๊ฒŒ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด TypeScript๋Š” _์ •๋ง_ ๋‚˜์œ ๋„๊ตฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•ต์‹ฌ ํŒ€์— "Microsoft"๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ ๋‚ด๊ฐ€ ๋งŒ๋‚œ ๊ฐ€์žฅ ์ž‘์€ Microsoft ํŒ€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฆด๋ฆฌ์Šค ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ํ†ต์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๋ฆฝ๋œ ํ›„ ์ถœ์‹œ ์ฃผ๊ธฐ๋ฅผ ์™„์ „ํžˆ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์ „ํˆฌ๋ฅผ ๋ฒŒ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ ๊ฐœ๋ฐฉ์„ฑ๊ณผ ํˆฌ๋ช…์„ฑ์„ ์œ„ํ•ด ์‹ธ์› ์Šต๋‹ˆ๋‹ค. CodePlex์—์„œ GitHub๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์‹ธ์› ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํŒ€์ด ๊ทธ๋“ค์˜ ๋ชจ๋ธ์„ ์ฑ„ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋“ค์€ Microsoft์—์„œ ๋” ์ด์ƒ ๊ณ ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ทธ๋“ค์€ VSCode ํŒ€์ด ๋น ๋ฅด๊ฒŒ ๋’ค๋”ฐ๋ฅด๋ฉด์„œ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ํ•œ ์‚ฌ๋žŒ๋“ค์ด์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด ์ดํ•ด๋Š” ์ด๊ฒƒ์ด #16607๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์ตœ๊ทผ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ž‘์„ฑ์ž๋กœ์„œ, Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ TypeScript๋กœ ์ž‘์—…ํ•  ๋•Œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด๊ฒƒ์ด ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@mrmckeb ์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” typescript AST ๋ณ€ํ™˜์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ  ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ๋Š” ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ(์ •์˜๋˜์ง€ ์•Š์€) ๋ฒ”์œ„์—์„œ ์ „์ฒด ํŒŒ์ผ ๋ณ€ํ™˜์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— 2์„ผํŠธ๋ฅผ ๋”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ์ผ๋ถ€๋Š” ํ›Œ๋ฅญํ•œ ํ”„๋กœ์ ํŠธ babel-plugin-macros ์— ๋Œ€ํ•ด ๋“ค์–ด๋ดค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ฒœ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋กœ ๊ตฌ๋™๋˜๋Š” ์œ ์ผํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ตฌ์„ฑ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ํˆฌ๋ช…ํ•œ ์‹œ์Šคํ…œ. ์ด๊ฒƒ์€ ๋งคํฌ๋กœ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ๊ตฌ์„ฑ์„ ๊ธˆ์ง€ํ•˜๋Š” CRA ์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ํŠนํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ €๋Š” ์ด๊ฒƒ์„ TypeScript ์„ธ๊ณ„๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ† ๋ก  ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ†ต์ฐฐ๋ ฅ์ด ์žˆ์œผ์‹œ๋ฉด ์™€์„œ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค.

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

@FredyC ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ์ง€๋งŒ tsc ๋งŒ ์‚ฌ์šฉํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•˜๋ ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด babel-plugin-macros์˜ ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ .babelrc ์— ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ tsconfig.json ์˜ typescript์— ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, babel-plugin-macro์™€ ๊ฐ™์€ ๋™์ž‘์„ TypeScript์— ๋‚ด์žฅํ•˜๊ณ  ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ข‹์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ tsconfig.json ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ง€์ •ํ•œ ๋‹ค์Œ typescript ast ๋…ธ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” babel-plugin-macros ๋ฒ„์ „์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@dsherret ์˜ˆ, TypeScript ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€ํ™˜์ด ์ค€๋น„๋˜๋ฉด ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ๋ณ€ํ™˜๋งŒ ์ฃผ์ž…ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” tsc ๊ฐ™์€ ์ž‘์€ ๋ž˜ํผ๋ฅผ ์‰ฝ๊ฒŒ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‚ฌ์‹ค, ์ž‘์€ ๋ž˜ํผ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ https://github.com/cevek/ttypescript ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ”์šฉ ๋งคํฌ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜๊ธฐ ์‰ฝ๊ณ  ์œˆ-์œˆ์ž…๋‹ˆ๋‹ค.

Typescript ๋ณ€ํ™˜์— ์ •ํ†ตํ•œ ์‚ฌ๋žŒ๋“ค์„ ์ฐพ์•„์„œ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœํ† ํƒ€์ž…์„ ํŒŒ์•…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ† ๋ก ํ•˜๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์˜ ํ˜„์žฌ ๋Šฅ๋ ฅ๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ๋‚ด๋ถ€์—์„œ ๋ฌธ์ œ๋ฅผ ๊นจ๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„๊นŒ๋ด ๋‘๋ ค์›Œ ๋‹ค๋ฅธ API/ํ‘œ๋ฉด์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3๋…„ ๋™์•ˆ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์—…ํ•˜๊ณ  ์ง„ํ™”๋ฅผ ์ง€์ผœ๋ณธ ๊ฒฐ๊ณผ ๊ฐ„๋‹จํ•œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. Microsoft๋Š” _code_์˜ ์˜๋ฏธ์—์„œ Typescript๋ฅผ ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ _process_์˜ ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋Š” _decisions_์™€ _coding_ ๋ชจ๋‘์—์„œ ๋‹ค์†Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฃผ๋„์ ์ด๋ฉฐ ์ด๊ฒƒ์ด ์ง„ํ™”ํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. node.js์˜ IO.js ํฌํฌ๋ฅผ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ? ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ํšŒ์‚ฌ์˜ ์ด์ต์ด ์ผ๋ฐ˜์ ์ธ ์˜คํ”ˆ ์†Œ์Šค ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ  ๋‹จ์ˆœํžˆ ๋ถ„๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. TypeScript์—์„œ๋Š” ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Microsoft๋Š” ์ด ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋“ค์€ ํ›Œ๋ฅญํ•œ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ๋‚ด 2c, OT์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

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

"๊ทธ๋ƒฅ ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง ์™ธ์— ํ•ฉ๋ฆฌ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑฐ์ ˆ์„ ๋ฐ›์•„๋“ค์ด๊ฒ ์ง€๋งŒ, ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ชจ๋“  ์š”์ฒญ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•„์ง ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ถ€๋‹นํ•œ ๋น„ํŒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @pietrovismara. ์ด๊ฒƒ์ด ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์„ ์ฐจ๋‹จํ•˜๋Š” "Microsoft"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•Œ๊ธฐ๋กœ ํŒ€์—์„œ๋Š” ์ง€์›ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

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

์ข‹์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ง€์›์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ €๋Š” ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” TypeScript๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ CRA์—์„œ ํ•ญ์ƒ CSS ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์†”๋ฃจ์…˜์„ ์š”์ฒญ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ณง ์˜ค๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ, ๋˜ํ•œ ๊ทธ๊ฒƒ์ด ํŒ€์— ํฐ ์œ„ํ—˜ ์˜์—ญ์„ ์—ด์–ด์ค€๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

... ์•„์ง ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :(

๋„ค, ์•„์ง ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ๋ฌด์—‡์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ ttypescript ๋ณด๋‹ค ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
TypeScript ๊ฐœ๋ฐœ์ž๋Š” ๊ฒฐ๊ตญ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€์›ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ๋‹น์‹  ์ž์‹ ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ;-)

์ฃผ์ œ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋ณ€ํ™˜๊ธฐ ์ง€์›์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋กœ ์‚ฌ์šฉํ•  ๊ตฌํ˜„๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค(์™€์šฐ!)*. ์‚ฌ๋žŒ๋“ค์ด ๋ณ€์••๊ธฐ์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฌ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฐฌ๋ฐ˜ ์–‘๋ก ์„ ์žฌ๊ณ ํ•˜๋Š” ๋ฐ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ?

API์— ๋Œ€ํ•œ ๋ฌธ์„œ๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ฝ”๋“œ <-> ๋ณ€ํ™˜๊ธฐ <-> API์˜ ๋ฉ”์‰ฌ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด์ „์— ์กด์žฌํ–ˆ๋˜ ์ดˆ๊ธฐ ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์›์€ babel๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ ๋†€๋ผ์šด ์„ฑ๊ณผ๋ฅผ ๊ฑฐ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜‘์—…์„ ํ†ตํ•œ ์ง„ํ–‰. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Babel์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typescript์™€ ๊ฐ™์€ ๋ณ€ํ™˜๊ธฐ์˜ ๋” ์‰ฌ์šด "๊ทธ๋ƒฅ ์ž‘๋™" ํ†ตํ•ฉ์ด _์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด ํŒจํ‚ค์ง€๋Š” ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ์ „์ฒด์— ํ˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ ๊ฐ•๋ ฅํ•œ ๊ณ„์•ฝ! ๐Ÿ˜ƒ

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

* ๊ทธ ๋™์•ˆ ๋ˆ„๊ตฐ๊ฐ€ ๋Œ€์‹  TS์šฉ ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค( ttypescript ). ๋‚˜๋Š” ์ด๊ฒƒ์„ ์„ฑ๊ณต์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@DanielRosenwasser 3.5 ๋ฐ˜๋ณต ๊ณ„ํš ์— "TypeScript ํ”Œ๋Ÿฌ๊ทธ์ธ API ์กฐ์‚ฌ"๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž‘์—…์€ ์ด๋ฏธ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค).
๊ทธ ์š”์ ์€ ์ด๋ฒˆ ํ˜ธ์—์„œ ๋…ผ์˜๋œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์•„์ง ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ณต์œ ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ WIP๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

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

๋‹ค์Œ ์ง€์นจ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ํŒ€์˜ ์ˆœ์ „ํ•œ ๊ณผ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

tslint์™€ ์ฝ”๋“œ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ ๋กœ type-to-code ๋ณ€ํ™˜์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ๋งˆ์ปค๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์œ ์ผํ•œ ๋ชฉํ‘œ๊ฐ€

  • ๋ณ€ํ˜•์˜ ์žฅ์†Œ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด
  • ์ƒ์„ฑ๊ธฐ์˜ ์ •๋ณด ์†Œ์Šค๊ฐ€ ๋  ์œ ํ˜•์„ ์บก์ฒ˜ํ•˜๋ ค๋ฉด

๋ฐ๋ชจ ๋ชฉ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„๊ณผ ์†์„ฑ ์œ ํ˜•์„ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด๋กœ ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋คํ”„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” Windows ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜๊ฐ€ Windows ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์‹ ์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. VSCode ์‹œ์ž‘
  2. ๋‹ค์Œ ํ™•์žฅ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค: https://github.com/Microsoft/vscode-typescript-tslint-plugin
  3. VSCode๋ฅผ ๋‹ซ์œผ์‹ญ์‹œ์˜ค
  4. ์›ํ•˜๋Š” ํด๋”๋กœ ์ด๋™
  5. git clone https://github.com/zpdDG4gta8XKpMCd/code-gen.git ์‹คํ–‰
  6. code-gen ํด๋”๋กœ ์ด๋™: cd ./code-gen
  7. ์šด์˜

    • 1-install.bat

    • 2-build.bat

    • 3-install-some-more.bat

    • 4-try.bat

  8. ์—ด๋ฆฐ VSCode ์ธ์Šคํ„ด์Šค ๊ด€์ฐฐ
  9. test.ts ๋กœ ์ด๋™( Ctrl + P -> test.ts )
  10. ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋กํ•ด ๋‘์‹ญ์‹œ์˜ค. ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์˜ ์†Œ์Šค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
interface Data {
    one: string;
    another: number;
}
  1. ๋งˆ์ปค๋กœ ์‚ฌ์šฉํ•  ํŒฌํ…€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค.
function gen<_T>() {
    return function (meh: any) {};
}
  1. ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ปค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ๋ถ€ ์ž๋™ ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ๋ฐ€์–ด๋„ฃ๊ณ ์ž ํ•˜๋Š” ์žฌ์ž‘์„ฑ ์‚ฌ์ดํŠธ๋ฅผ ๊ธฐ๋กํ•ด ๋‘ก๋‹ˆ๋‹ค.
@gen<Data>()
export class Gen {
}
  1. @gen<Data>() ์•„๋ž˜์˜ ๊ตฌ๋ถˆ๊ตฌ๋ถˆํ•œ ์„ ์„ ๊ด€์ฐฐํ•˜์‹ญ์‹œ์˜ค.
    image

  2. Quick fix... ์„ ํƒ -> Needs a rewrite, wanna fix?
    image

  3. ์ž๋™ ์ƒ์„ฑ ์ฝ”๋“œ ๊ด€์ฐฐ:
    image


์—ฌ๊ธฐ์— ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด codeGenRule.ts ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ๊ธฐ์˜ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

import * as Lint from 'tslint';
import * as ts from 'typescript';

export class Rule extends Lint.Rules.TypedRule {
    public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
        return this.applyWithWalker(new Walker(sourceFile, this.getOptions(), program.getTypeChecker()));
    }
}

class Walker extends Lint.RuleWalker {
    constructor(sourceFile: ts.SourceFile, options: Lint.IOptions, private checker: ts.TypeChecker) {
        super(sourceFile, options);
    }
    public visitNode(node: ts.Node) {
        if (ts.isDecorator(node)) {
            const checked = check(node, this.checker);
            if (checked !== undefined) {
                const [node, message, replacement] = checked;
                this.addFailureAtNode(node, message, replacement);
            }
        }
        super.visitNode(node);
    }
}

function check(node: ts.Decorator, checker: ts.TypeChecker) {
    const { expression, parent } = node;
    if (!ts.isClassDeclaration(parent)) return;
    if (!ts.isCallExpression(expression)) return;
    const { expression: identifier, typeArguments: typeArgs } = expression;
    if (!ts.isIdentifier(identifier)) return;
    const { text: name } = identifier;
    if (name !== 'gen') return;
    if (typeArgs === undefined) return;
    if (typeArgs.length > 1) return;
    if (typeArgs.length < 1) return;
    const [only] = typeArgs;
    const type = checker.getTypeFromTypeNode(only);

    // if you got to here, you are at the right place and you have a type

    // working on a fix
    const properties = checker.getPropertiesOfType(type);
    const allNameTypes = properties.map(p => {
        const { name } = p
        const type = checker.getTypeOfSymbolAtLocation(p, node);
        return name + ': \'' + checker.typeToString(type) + '\';'
    })
    const { newLine } = ts.sys;
    const body = newLine + allNameTypes.join(newLine);
    const { pos: start, end } = parent.members;
    return [
        node,
        'Needs a rewrite, wanna fix?',
        Lint.Replacement.replaceFromTo(start, end, body)
    ] as const;
}

@zpdDG4gta8XKpMCd , ๊ฐœ๋…์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์˜ ๋ฐ”๋ฅด๊ฒŒ ํ–‰๋™ํ•˜์„ธ์š”.

๋””์ž์ธ ํŒ€์˜ ์ˆœ์ „ํ•œ ๊ณผ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹น์‹ (๊ทธ๋ฆฌ๊ณ  ๋‚˜๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค)์ด ๊ฐ–๊ณ  ์‹ถ์–ดํ•˜๋Š” _๊ธฐ๋Šฅ_์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” TypeScript๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฃผ์š” ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ฉฐ "๊ณผ์‹ค"์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์˜๋ฅผ ์ง€์ผœ์ฃผ์„ธ์š”.

์˜ค, ์ œ๋ฐœ ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋งˆ์„ธ์š”. ์ด๊ฒƒ์€ ์ œ๊ฐ€ ํ•ญ์ƒ ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์„ฑ๊ฒฉ์ด ๋งค์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฑด๊ฐ• ์ƒํƒœ). ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ œ ์ž์‹ ์„ ์งœ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์ž…๋‹ˆ๋‹ค, ์ •๋ง ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค

๋‹น์‹ ์€ ๋‚˜๋ฅผ ๋†€๋ผ๊ฒŒํ•˜๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

  • ๋‹น์‹ ์ด ๋ณด๋Š” ๊ฒƒ์€ ํŽธ์•ˆํ•จ์œผ๋กœ ์˜ค๋Š˜๋‚ ์˜ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค(์†์ž„์ˆ˜ ์—†์Œ, ํ•ดํ‚น ์—†์Œ)
  • ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋””์ž์ธ ํŒ€์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ์ด๋ฉฐ ์ด์ „์— ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ž˜๋ชป๋œ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ์•„๊ฐ€๋ ค๊ณ  ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๋“ฏ์ด ๋””์ž์ธ ํŒ€์ด ์ฆ‰์‹œ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. #4212,
  • ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ–๋Š”๋‹ค๋ฉด ๋„ˆ๋ฌด ๋Šฆ์„ ๋•Œ๊นŒ์ง€ ๋” ๋นจ๋ฆฌ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ด ๋ฐฉํ–ฅ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ž์œผ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋‚ด ํ”ผ๋“œ๋ฐฑ์˜ ์–ด์กฐ๋Š” ๋ถ€์ ์ ˆํ–ˆ์ง€๋งŒ 2017๋…„ 3์›” 2์ผ ์ดํ›„(2๋…„ ์ด์ƒ) ์ ์ ˆํ•œ ์–ด์กฐ๋กœ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์–ป์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, 2๋…„ ๋” ๊ธฐ๋‹ค๋ ค๋„ ๋ฉ๋‹ˆ๋‹ค.

@zpdDG4gta8XKpMCd ์‹ค์ œ ๊ตฌํ˜„์— ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๊นŒ? TypeScript๋Š” ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด(๋ถ€๋ถ„์ ์œผ๋กœ๋ผ๋„) ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๋ฌด๋ก€ํ•จ์„ ์˜ํ•™์  ์ƒํƒœ๋กœ ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์€ ์šฉ๋‚ฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜๊ฐ€ ์ž…๋ ฅํ•˜๊ณ  ์ž๋ฐœ์ ์œผ๋กœ "๋Œ“๊ธ€"์„ ํด๋ฆญํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์งˆ๋ณ‘๋„ ๋‹น์‹ ์„ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ดํ•‘์ด ์•„๋‹ˆ๋ผ ๋งํ•˜์„ธ์š”. ๋‹น์‹ ์€ ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์˜ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ํŽธ์ง‘ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๊ฐ€ _now_ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Babel์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ชจ๋“  TypeScript์—์„œ ์œ ํ˜• ์ฃผ์„์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ตฌ๋ฌธ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋„ˆ์Šค๋กœ ์†๋„๋„ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

Microsoft์˜ ์ €์žฅ์†Œ์—์„œ ์˜๊ตฌ์ ์œผ๋กœ ์ซ“๊ฒจ๋‚˜๊ธฐ ์ „์— ๋Œ“๊ธ€ ์ž‘์„ฑ์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด repo๋ผ๋ฉด, โ€‹โ€‹๋‹น์‹ ์€ ๋งˆ์ง€๋ง‰ ๋นจ๋Œ€์—์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.

์•Œ์•˜์–ด, ๋„Œ ๋‚  ์ซ“์•„๋ƒˆ์–ด, ๊ทธ๋Ÿผ ์–ด์ฉŒ์ง€
๋‚ด๊ฐ€ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ? ์ƒˆ ๊ณ„์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋‚ด๊ฐ€ ์ด ๊ณ„์ •์„ ๋„ˆ๋ฌด ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์•„?

์–ด์จŒ๋“ , ์˜ˆ, ์ €๋Š” pull ์š”์ฒญ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ๋‹น์‹ ์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋ฒ”์ฃผ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋‹ค์†Œ ์‚ฌ์†Œํ•˜๊ณ  ๋œ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

  2. ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ(224๊ฐœ์˜ ์—„์ง€์†๊ฐ€๋ฝ์„ ๋“ค์–ด๋„)๋Š” ๊ณ ๋ คํ•œ๋‹ค๋ฉด ๋ช‡ ๋…„์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์šด ์ข‹๊ฒŒ๋„ ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๊ฐ€์ง„ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋Š˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฐจ์ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ์•ˆ(์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋‚˜๋ฅผ ๋น„๋‚œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค)

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


@Janpot ๋„ค , WIP์— ๊ฐ€๊น์ง€๋งŒ @rbuckton ์ด ๋Œ์•„์˜ค๋ฉด ์ƒํƒœ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@DanielRosenwasser ๊ทธ๋‹ค์ง€ ๋ƒ‰์†Œ์ ์ด์ง€ ์•Š๊ณ  ๋”ฑ 2๋งˆ๋””๋งŒ ํ•˜๊ณ  ๊ทธ ์ ์— ๋Œ€ํ•ด ์ง„์‹ฌ์œผ๋กœ ๋ฏธ์•ˆํ•˜๋‹ค๊ณ  ๋งํ–ˆ๋‹ค

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

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋น„๋‚œํ•  ์‚ฌ๋žŒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ช‡ ๋…„์— ๊ฑธ์ณ ๋ฐฉ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ƒ์‚ฐ์ ์ด์ง€ ๋ชปํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

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

  • A, BC ๋ฐ D, E ๋ฐ F๊ฐ€ ๋จผ์ € ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š”์ด ๋Œ€ํ™”๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : https://github.com/Microsoft/TypeScript/issues/30696#issuecomment -478799258

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

์šฐ๋ฆฌ๊ฐ€ ์ด์™€ ๊ฐ™์ด ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•œ ์ž‘์—…์— ์•ž์„œ ์ž˜ ์•Œ๋ ค์ง„ ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰(๋˜๋Š” ์— ๋Œ€ํ•œ PR ํ—ˆ์šฉ )ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€ํ•˜์‹ค์„ ๋ฆฌ๋ชจ๋ธ๋งํ•˜๊ณ  ์ง‘ ๊ผญ๋Œ€๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ด ์•„์ง ์ง„ํ–‰ ์ค‘์ธ ๋™์•ˆ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์™€์„œ ์ƒˆ๋Š” ์ˆ˜๋„๊ผญ์ง€๋ฅผ ์ˆ˜๋ฆฌํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ์ถ”์ธกํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@zpdDG4gta8XKpMCd ์™œ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ํƒ“ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์• ์ดˆ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์„ ํ•˜์ง€ ์•Š์€ ์ž์‹ ์„ ํƒ“ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” ๊ตฌํ˜„ ๊ด€์ ์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฑด์„ค์ ์ธ ๊ธ€์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•—, ๋ฐฉ๊ธˆ ๋งํฌํ•œ ํˆฌ๋ช…ํ•œ ๊ธ€์„ ์“ฐ๊ณ ๋„ 2์ฃผ ๋งŒ์— ๊ณฐ์„ ๋‹ค์‹œ ์ฐŒ๋ฅด๊ธฐ๋กœ ํ•˜์…จ์–ด์š”? 1500๊ฐœ ์ด์ƒ์˜ ์ž‘์—…์ด ์žˆ๋Š” ๊ทธ ์œ„์น˜์— ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒ€์—์„œ๋Š” 100๊ฐœ ์ •๋„์˜ ์ž‘์—…์„ ์˜ฎ๊ธฐ๊ณ  ์ƒ๋‹นํžˆ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 15๋ฐฐ๋‚˜ ๋” ๋งŽ์„ ์ค„์€ ์ƒ์ƒ๋„ ๋ชปํ•จ ๐Ÿ˜ฎ

@FredyC ๋ง™์†Œ์‚ฌ, ๋‚ด๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์ „์— ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ด

์˜ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ณต์‹์ ์ธ pull ์š”์ฒญ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ๋‚˜๋Š” ์ข‹์€ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ์ˆ˜์ค€์— ์žˆ์ง€ ์•Š๋‹ค

  2. ๊ฐ„๋‹จํ•œ ์Šน์ธ์˜ ๊ฒฝ์šฐ ๊ธด ์ค„์„ ์„œ์•ผ ํ•˜๊ณ  2๋…„ ์ „์— ์ƒ์„ฑ๋œ pull ์š”์ฒญ์„ ํ˜„์žฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๋ฉด ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. Anders hejlsberg์™€ ๊ฐ™์€ ์†Œ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค๋งŒ์ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฑฐ๋Œ€ํ•œ ์„ค๊ณ„ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•  ๋•Œ ํŠน์ • ๋ฌธ์ œ๋Š” ๊ณ ๋ ค์กฐ์ฐจ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ขŒ์ ˆ ๋ถ€๋ถ„์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์—ฌ๊ธฐ์— ํ˜ผ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์ธ์ด ์ž‘์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์–ธ์–ด์˜ ์›…์žฅํ•œ ๋””์ž์ธ
  • ์˜ˆ์‚ฐ / ์ž์› / MS ๋‚ด๋ถ€ ์ •์น˜
  • ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์†Œ์›

์ด ์žฌ๋ฃŒ๋“ค์„ ์„ž์–ด์„œ ๋‚ด๋ฆฐ ๊ฒฐ์ •์ด ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ํ…๋ฐ

๋‚œ ๋๋‚ฌ์–ด ๋„ˆ๋ฌด ๊ฐ”์–ด ์ƒ์ฒ˜๋ฐ›์€ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฏธ์•ˆํ•˜์ง€๋งŒ ๋‚˜๋Š” ์•„๋ฌด ๋ง๋„ํ•˜์ง€ ์•Š์„๊ฑฐ์•ผ

https://github.com/Microsoft/TypeScript/issues/14419#issuecomment -483920640์˜ ์—ฐ์†

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ํ•จ์ˆ˜ ์„ ์–ธ ์ž์ฒด๋ฅผ ๋งˆ์ปค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ด๋ฆ„์ด toRandom... ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์˜ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ์˜ ์ •๋ณด ์†Œ์Šค๋Š” ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค:

  1. toRandom... ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜ ์•„๋ž˜์˜ ๊ตฌ๋ถˆ๊ตฌ๋ถˆํ•œ ์„ ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    image
  2. ์˜ต์…˜ ํƒ์ƒ‰:
    image
  3. ๋นจ๋ฆฌ ๊ณ ์น˜๋‹ค
    image
  4. ๊ฒฐ๊ณผ ๊ด€์ฐฐ:
    image

๋‹ค์Œ์€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” codeGenRule.ts ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

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

import * as Lint from 'tslint';
import * as ts from 'typescript';

export class Rule extends Lint.Rules.TypedRule {
    public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
        return this.applyWithWalker(new Walker(sourceFile, this.getOptions(), program.getTypeChecker()));
    }
}

class Walker extends Lint.RuleWalker {
    constructor(sourceFile: ts.SourceFile, options: Lint.IOptions, private checker: ts.TypeChecker) {
        super(sourceFile, options);
    }
    public visitFunctionDeclaration(node: ts.FunctionDeclaration) {
        const checked = check(node, this.checker);
        if (checked !== undefined) {
            const [node, message, fix] = checked;
            this.addFailureAtNode(node, message, fix);
        }
        super.visitFunctionDeclaration(node);
    }
}

function check(node: ts.FunctionDeclaration, checker: ts.TypeChecker) {
    const { name: identifier, type: result, body } = node;
    if (body === undefined) return;
    if (identifier === undefined) return;
    const { text: name } = identifier;
    if (!name.startsWith('toRandom')) return;
    if (result === undefined) return;
    const type = checker.getTypeFromTypeNode(result);

    // if you got to here, you are at the right place and you have a type

    // working on a fix
    const properties = checker.getPropertiesOfType(type);
    const newerBody =
        `{
    return {${properties.map(prop => {
            const { name } = prop;
            const type = checker.getTypeOfSymbolAtLocation(prop, node);
            const typeName = capitalize(checker.typeToString(type));
            return `
        ${name}: toRandom${typeName}(),`;
        }).join('')}
    };
}`;
    const olderBody = body.getFullText();
    if (areEqual(olderBody, newerBody)) return;
    const start = body.getFullStart();
    const end = start + body.getFullWidth();
    return [
        node,
        'Needs a rewrite, wanna fix?',
        Lint.Replacement.replaceFromTo(start, end, newerBody),
    ] as const;
}

function areEqual(one: string, another: string) {
    // AB: we cannot make any assumption what line endings are,
    // this is why we compare the text of code without them
    return one.replace(/\r\n|\n/g, ' ') === another.replace(/\r\n|\n/g, ' ');
}

export function capitalize(value: string): string {
    const length = value.length;
    if (length > 1) {
        return value.substr(0, 1).toUpperCase() + value.substr(1);
    } else if (length > 0) {
        return value.substr(0, 1).toUpperCase();
    } else {
        return value;
    }
}

@zpdDG4gta8XKpMCd ๋‚ด ์ƒ๊ฐ์— ์ด ๋ฌธ์ œ๋Š” ๋ฐฉ์ถœํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€์••๊ธฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๊นŒ? ์ „. tsconfig.json์— ๋ณ€ํ™˜์„ ์ง€์ • ํ•˜์—ฌ api ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  tsc ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘๊ธฐ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ/์ˆ˜์ •์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์–ธ์–ด ์„œ๋น„์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์–ธ์–ด ์„œ๋น„์Šค์—์„œ getCodeFixesAtPosition ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  ์ž์‹ ์˜ ์ฝ”๋“œ ์ž‘์—…์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... ํ™•์‹คํ•˜์ง€ ์•Š์Œ) https://github.com/Microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin

์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ์š”?

์˜ค๋ฅธ์ชฝ. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค

tsconfig.json ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฟˆ์ด ์‹คํ˜„๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋” ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ”Œ๋Ÿฌ๊ทธํ˜• ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • typescript์—๋Š” ๊ทธ๋Ÿฐ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ ๋‚˜๋Š” tslint(2019๋…„ ๋ง๊นŒ์ง€ ๊ฐ๊ฐ€์ƒ๊ฐ๋จ)๊ฐ€ ๋งค์šฐ ์ž์œ ๋กญ๊ฒŒ ์ฝ”๋“œ๋ฅผ ํ”Œ๋Ÿฌ๊ทธ์ธํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” typescript์— ์ ํ•ฉํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”Œ๋žซํผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์žˆ์Œ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

    • ํ”Œ๋Ÿฌ๊ทธ ๊ฐ€๋Šฅ ๋ฐ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

    • ํ•„์š”ํ•œ ๋ชจ๋“  UI์™€ ํ•จ๊ป˜

    • typescript์— ๋Œ€ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    • ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ typescript ์–ธ์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ:

  • ๋‚ด ๋žฉํ†ฑ์€ ๋งŽ์€ typescript ์–ธ์–ด ์„œ๋น„์Šค๋งŒ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • vscode ์ค‘ ํ•˜๋‚˜

    • tslint ์ค‘ ํ•˜๋‚˜

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ ์œ„์— ๋‹ค๋ฅธ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๋‚ด ์ฝ”๋“œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค: #4892

  • ๋‚ด ๋žฉํ†ฑ์€ ๋งŽ์€ typescript ์–ธ์–ด ์„œ๋น„์Šค๋งŒ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ํ•˜๋‚˜์˜ vscode
    • ํ•˜๋‚˜ by tslint

@zpdDG4gta8XKpMCd ๋ชจ๋“  ๊ฒƒ์ด ๋™์ผํ•œ ์–ธ์–ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ ์žˆ๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ํ•จ๊ป˜ tslint ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ด๋ฅผ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.

Btw, ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์ด ์—ฌ๊ธฐ ์—์„œ ์ˆ˜ํ–‰๋œ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์–ธ์–ด ์„œ๋น„์Šค ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ™•์‹คํžˆ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์—ฌ๊ธฐ์—์„œ๋Š” ํŽธ์ง‘๊ธฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ/์–ธ์–ด ์„œ๋น„์Šค ํ•ญ๋ชฉ์ด ์•„๋‹Œ tsc ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋Œ€ํ™”๋ฅผ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์œผ๋ฉฐ ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค(ํŠนํžˆ ํ•ด๋‹น ์‹œ์ ์—์„œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์ด์ƒ์ ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ํŽธ์ง‘๊ธฐ/tsserver ๋˜๋Š” ์–ธ์–ด ์„œ๋น„์Šค์™€ ๊ด€๋ จ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์†Œ์ค‘ํ•œ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๊ณ ๋ คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

tsc ๋นŒ๋“œ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋Œ€ํ™”๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ž‘์„ฑ๋œ ์›๋ž˜ ์š”์ฒญ์€ ์ „๋‹ฌ๋  ์–‘์‹ ๋ณ€ํ™˜์ด ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์œผ๋ฉฐ,
    > ๋‹จ์ผ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด tsc ๋ช…๋ น์ค„์„ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค.
  • 2๋…„ ๋™์•ˆ ์ด ํ† ๋ก ์€ ์†”๋ฃจ์…˜์ด ์žˆ๊ณ  ์ž‘๋™ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ ๋ณ€์••๊ธฐ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ƒ๋‹นํ•œ ๊ด€์‹ฌ์„ ๋Œ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ tslint ํŒ€์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์œ„ํ•œ ์ธํ”„๋ผ๋ฅผ ์ž˜ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋…ธ๋ ฅ์„ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ typescript๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” typescript ์™ธ๋ถ€์—์„œ ๊ณต์‹์ ์œผ๋กœ ์œ ์ผํ•˜๊ฒŒ ์ธ์ •๋˜๋Š” ํ”Œ๋žซํผ์ด๋ผ๋ฉด
  • ๋˜ํ•œ, ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋ณ€์••๊ธฐ๊ฐ€ ์–ธ์–ด๋กœ ๊ฐ€๋Š” ๊ธธ์„ ์ฐพ๋”๋ผ๋„ ๊ณง ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค(์ €๋ฅผ ํฌํ•จํ•˜์—ฌ)์€ ์–ด์ œ์ฒ˜๋Ÿผ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ์ œ์•ˆ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๋””์ž์ธ ํŒ€์ด ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋” ์—ด์‹ฌํžˆ ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๋Š” ๋™์•ˆ). ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์•ˆ ๋ ๊นŒ์š”?

๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์‹ ๋‹ค๋ฉด ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

ํ•˜์ง€๋งŒ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์šฐ๋ ค๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด

์ „์ฒด ํ”„๋กœ์ ํŠธ์— ๊ฑธ์ณ ๋ณ€ํ˜•

tslint๋Š” cli์— ๋Œ€ํ•œ --fix ์ธ์ˆ˜๋กœ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@zpdDG4gta8XKpMCd --fix ๋Š” TypeScript ์ฝ”๋“œ๋ฅผ ์ œ์ž๋ฆฌ์— ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ฐฉ์ถœ ์ค‘์— ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ตœ์ข… JavaScript ํŒŒ์ผ์—์„œ๋งŒ ๋๋‚ฉ๋‹ˆ๋‹ค). ์ฐธ์กฐ๋œ ๋ฌธ์ œ์˜ PR(#13940)์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

#13764๊ฐ€ ์ถœ์‹œ๋œ ์ดํ›„๋กœ ์ปค์Šคํ…€ ํŠธ๋žœ์Šคํฌ๋จธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ API๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ๋‹จ์ผ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด tsc ๋ช…๋ น์ค„์„ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” typescript์— ๋”ฐ๋ผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด tsc ๋ช…๋ น์ค„ ๋„๊ตฌ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ˜ธํ™˜์„ฑ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ•ด๋‹น ๋ฌธ์ œ๋กœ ์ธํ•ด CustomTransformers ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ(ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ณ  API์—์„œ ์‚ฌ์šฉ๋œ ์œ„์น˜ ํ™•์ธ) tsc ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  ๋ณต์ œํ•˜๊ฑฐ๋‚˜ ๋ž˜ํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ttypescript ๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ๋‹จ๋ฝ์—์„œ๋Š” ๊ธฐ์กด ๋นŒ๋“œ ๋„๊ตฌ์— ์ž˜ ํ†ตํ•ฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  tsc์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

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

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋Œ€๋‹ตํ•ด์•ผ ํ•  ์ฃผ์š” ์งˆ๋ฌธ์€ Daniel์ด ๋…ผ์˜ํ•œ ๊ฒƒ("๋‹จ์ˆœํ•œ ์‚ฌ์ „ ๋ฐ ์‚ฌํ›„ ๋ณ€ํ™˜๊ธฐ๋ณด๋‹ค ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ")๊ณผ ๋นŒ๋“œ์˜ ์ด ๋ถ€๋ถ„์„ ๋งŒ๋“œ๋Š” ์†”๋ฃจ์…˜์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋ชจํ˜ธํ•˜๋‹ค

๋‚˜๋Š” ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ๊ฐ์‚ฌํ•˜๋Š” ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค

๋‚ด ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์•ฝ 3500๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ค‘ 15%๋Š” ์†์œผ๋กœ ์ž‘์„ฑ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ทธ ์œ„์— ์œ ์‚ฌํ•œ ํ•ญ๋ชฉ์ด ์•ฝ 5% ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋™์‹œ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์™„์ „ํžˆ ๊ตฌ์›Œ์ง€๊ธฐ ์œ„ํ•ด ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ์ •๋‹นํ™”ํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋ฐ˜์ฏค ๊ตฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ์™”์„ ๋•Œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ์— ์ ์ ˆํ•œ ์žฅ์†Œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์—ฌ๊ธฐ์— ์˜จ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ํ›จ์”ฌ ๋” ๋ฏธ์„ธํ•œ ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์™”์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋›ฐ์–ด๋‚œ!

๊ทธ๋ฆฌ๊ณ  ์•„๋‹ˆ์š”, ์ €๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ tslint๊ฐ€ ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ™˜์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋‚ด ๋ฌธ์ž์—ด l10n ๋ฐ i18n ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. tslint ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ถ”์ถœ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ทœ์น™๊ณผ ํ•จ๊ป˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ttypescript ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ต์…˜์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์€ ๋ฐฐ์ถœ๋˜์ง€ ์•Š์€ ๊ฐ๋„ ์•ฑ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋นŒ๋“œ ๋„๊ตฌ์˜ ๋ ˆ์ด์–ด์— ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์†๋„์— ๋”ฐ๋ผ ์ „์ฒด ์Šคํƒ์ด ์ •๋ง ๋ถˆ์•ˆ์ •ํ•ด์ง‘๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ ๋Ÿฐํƒ€์ž„์— ์œ ํ˜• ์ˆ˜์ค€ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ttypescript ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ณต์‹ ์ปดํŒŒ์ผ๋Ÿฌ์— plugins ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜„

์ง€๊ธˆ์€ ํœด๊ฐ€ ์ค‘์ด์ง€๋งŒ ๋‹ค์Œ ์ฃผ์— ๋Œ์•„์˜ฌ ๋•Œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2019๋…„ 7์›” 21์ผ ์ผ์š”์ผ ์˜คํ›„ 5:54 Giorgio Boa [email protected]
์ผ๋‹ค:

@longlho https://github.com/longlho ๋ฉ‹์ง„ ์•„์ŠคํŠธ๋ฅผ ๋งŽ์ด ๋งŒ๋“œ์…จ๋„ค์š”
ํŠธ๋žœ์Šคํฌ๋จธ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘
Angular ๋ณต์‚ฌ ์ „์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚ด ๋ชฉํ‘œ๋Š” ์ด ๋…ธ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Component({ selector: 'standard' ... })๋ฅผ Component({ selector: 'custom'
... })
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด github repo๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/gioboa/ng-ts-transformer . ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ
๋ฌธ์„œ๊ฐ€ ์—†์œผ๋ฉด ๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/microsoft/TypeScript/issues/14419?email_source=notifications&email_token=AABQM335QEEDNVT4NUICJQDQASBDXA5CNFSM4DCFER5KYY3PNVWWK3TUL52HS4DFVEXG43VMXHJ2LDNMV
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AABQM33S5IYXB5HOZTRVVX3QASBDXANCNFSM4DCFER5A
.

ํ”„๋ก์‹œ ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‹ค์ œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ttypescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ typescript์™€ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ์ •๋ง ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Typescript์™€ ์ด๊ฒƒ์ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์œ„๋Œ€ํ•œ ํ˜์‹  ์‚ฌ์ด์— ์„œ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

Typescript๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ํฐ ๊ธฐ์—ฌ๋ฅผ ํ•˜์ง€๋งŒ, ์ถ”๊ฐ€ ํ˜์‹ ์—๋„ ์ œ๋™์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹คโ€ฆ
์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ATM์€ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊นจ๋œจ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ „ํ˜€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :man_shrugging: ์™œ?
์ •๋ง ์ข‹์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์ง€๋งŒ. ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์€ (ํ‚ค)๋‹จ์–ด ํ† ํฐํ™” ๋ฐ AST ์„ค์น˜)๋ฅผ ์กด์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค... , ๋‚ด๋ถ€์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ค์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‰ฝ์ง€๋Š” ์•Š์ง€๋งŒ babel ํ”„๋กœ์ ํŠธ๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์‚ฌ์‹ค babel์ด ์ƒˆ๋กœ์šด ์˜๋ฏธ๋‚˜ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์‚ฌ์†Œํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” typescript์—์„œ ์˜๋ฏธ๋ก ์„ ํ—ˆ์šฉํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋˜ํ•œ ๋ฌผ๋ก  ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! )
๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ preeval๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
route ๋˜๋Š” message ๋˜๋Š” ๊ธฐํƒ€์™€ ๊ฐ™์€ take ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์ „ ํ‰๊ฐ€ํ•˜๊ณ  (์˜ค, ์ œ๋ฐœ, 1๋‹จ๊ณ„์—์„œ) ์ •ํ™•์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ๋‹จ๋ฝ์„ ์ด์ƒํ•˜๊ฒŒ ์ฝ๋Š”๋‹ค๋ฉด. tsx ๋ฐ ๋ชจ๋“  React ์žฅ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

React๋„ ์—†๊ณ , ํ๋ฆ„๋„ ์—†๊ณ , ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋„ ์ „ํ˜€ ์—†๊ณ , ํ•œ๋ˆˆ์— ๋ณด๊ธฐ์—๋„ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

์ œ๋ฐœ. ๋‚˜๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ฐ”๋ผ๋ณด๋Š” ๊ฒƒ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ IE5.5+์—์„œ ๋ฐฐ์šด ๊ฒƒ์ฒ˜๋Ÿผ; ์ฐจ๋‹จ์€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋ ˆ์ด์•„์›ƒ ์—”์ง„์ž…๋‹ˆ๋‹ค. D.Knuth๋Š” 50๋…„ ์ „์— ๋ชจ๋“  ๋ˆ„๋ฝ๋œ ๋ถ€ํ’ˆ์„ ๋””์ž์ธํ•œ guenie์˜€์Šต๋‹ˆ๋‹ค. ์™œ ์šฐ๋ฆฌ๋Š” ์˜ค๋Š˜ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?? :-)
์‚ฌ๋žŒ๋“ค์—๊ฒŒ JS ์‚ฌ์•…ํ•จ์—์„œ CSS๋ฅผ ์ค‘์ง€ํ•˜๋ผ๊ณ  ์•Œ๋ ค์ฃผ์„ธ์š”.

์ œ๋ฐœ. ์˜๋ฏธ๋ก ์  ์ง€๋Šฅ์„ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• TS ; ๋‚˜๋จธ์ง€์— ๋Œ€ํ•œ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ •์  ๋ฌธ์ž์—ด ์ž…๋ ฅ์ด ์žˆ๋Š” ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ const ์ž…๋ ฅ ๋ฌธ์ž์—ด ๋ถ„์„โ€ฆ
์•ฝ๊ฐ„์˜ ์˜ˆ:

  • GraphQL ํ˜ธ์ถœ ๋ฐ˜ํ™˜ ๋ชจ์–‘
  • ๊ตญ์ œ ์ž…๋ ฅ ๋ชจ์–‘
  • โ€ฆํ›จ์”ฌ ๋”_
    ์ œ๋ฐœ. ์˜๋ฏธ ์ฒด๊ณ„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ! :ํ† ๋ผ:

์ถฉ๋Œ

core-js import - @babel/preset-env ๋ฐ @babel/runtime $ ์™€ ๊ฐ™์€ ๋Œ€์ƒ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ž๋™ ํด๋ฆฌํ•„($#$3 babel #$ ์ œ์™ธ)์„ ์œ„ํ•œ TS ๋ณ€ํ™˜ ์ž‘์„ฑ์„ ์‹คํ—˜ ์ค‘์ž…๋‹ˆ๋‹ค. TS ๊ฐœ๋ฐœ์ž์˜ ํฐ ๋ถ€๋ถ„์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ttypescript ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๋„๊ตฌ ์—†์ด ์ƒ์ž์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œ๋˜๋ฏ€๋กœ ์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋Ÿฐ ์•„์ด๋””์–ด๋กœ ์‹คํ—˜์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค - https://github.com/webschik/typescript-polyfills-generator.
๋‚˜๋Š” Transformers API๊ฐ€ ๊ฐœ๋ฐœ ์ฒด์ธ์—์„œ babel ๋ฅผ ๋“œ๋กญํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ @babel/preset-env ์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œํ•œ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ํ˜„์žฌ ์ž์ฒด ์‚ฌ์šฉ์ž ์ง€์ • ์ปดํŒŒ์ผ๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ(TypeScript ์ปดํŒŒ์ผ๋Ÿฌ API ์‚ฌ์šฉ)๋ฅผ ๋กค๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ttypescript ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ๊ธฐ๋ณธ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํ™•์žฅ์œผ๋กœ ์ด๋™ํ•˜๋ ค๋Š” ์š•๊ตฌ๋Š” ๊ฑฐ๊ธฐ์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๊ฐ€ tsconfig.json์—์„œ ์ง€์›๋œ๋‹ค๋ฉด ํ™˜์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ tsconfig๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋ณ€ํ™˜๊ธฐ๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋” ๋‚˜์œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ •์˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํŒŒ์ผ ๋ณด๊ธฐ์™€ ๊ฐ™์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์‹ค์ œ๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ด ๊ฐ์ •์„ ๋ฐ˜์˜ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด TypeScript ๊ฐœ๋ฐœ ํŒ€์˜ ๋ถ€๋‹ด์ด ํฌ๊ฒŒ ์ค„์–ด๋“ค๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด ์–ธ์–ด๋กœ ํ˜์‹ ๊ณผ ์ถ”๊ฐ€์ ์ธ ์ถ”์ง„๋ ฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ์„ฑ๊ณต์ ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„์˜ ์˜ˆ๋Š” Serverless Framework์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํŒ€์€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์ˆ˜์š”๋ฅผ ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด PR์„ ์—ด๊ฑฐ๋‚˜ ํ•ต์‹ฌ ์ œํ’ˆ์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ์„ ์ถ•์†Œํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด(์‹คํ—˜์ ์ผ ์ˆ˜ ์žˆ์Œ) ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋„“์€ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์— ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋„์„œ๊ด€์„ ์ง“๊ณ  ์žˆ๊ณ  ๊ฑฐ๊ธฐ์—๋Š” ๋‚˜์—๊ฒŒ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ๋‚ด๊ฐ€ ์˜์กดํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ผ๋งˆ ์ „์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํŠธ๋ฆฌ ํ”๋“ค ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•œ ํ›„ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ ์ด๋Ÿฌํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ํ”๋“ค ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ๊ณง ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋  ์‚ฌ์šฉ ์‚ฌ๋ก€์— 2์„ผํŠธ๋ฅผ ๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

TypeScript๊ฐ€ ๋ž˜ํผ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ณต์žกํ•œ ์ง€์นจ ์—†์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ts-patch ( npm github )๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ts-patch(์ „์—ญ ๋˜๋Š” ๋กœ์ปฌ)๋ฅผ ์„ค์น˜ํ•˜๊ณ  ts-patch install ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ typescript๋ฅผ ํŒจ์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ typescript ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ TS๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์„ค์น˜๋˜๋Š” ๊ฒฝ์šฐ ํŒจ์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ง€์†์„ฑ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์„ธ๋ถ€์ •๋ณด: ts-patch /? )

ํŒจ์น˜ ๋กœ์ง์€ ๋Œ€๋ถ€๋ถ„ ttypescript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. (cevek์˜ ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ํฐ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!) npm ํŒจํ‚ค์ง€ ์„ค์น˜ ํ”„๋กœ์„ธ์Šค์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒจ์น˜ ํ•ด์ œ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์€ typescript ์ž์ฒด์˜ ๊ด€๋ จ ํŒŒ์ผ์„ ์ง์ ‘ ํŒจ์น˜ํ•˜๋ฉฐ ๋ž˜ํผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ข…์†์„ฑ ์„ค์น˜ ํ›„ ํŒจ์น˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด typescript๊ฐ€ ๋ณ€ํ™˜๊ธฐ ์ค€๋น„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

TypeScript๊ฐ€ ๋ž˜ํผ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ณต์žกํ•œ ์ง€์นจ ์—†์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ts-patch ( npm github )๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ts-patch(์ „์—ญ ๋˜๋Š” ๋กœ์ปฌ)๋ฅผ ์„ค์น˜ํ•˜๊ณ  ts-patch install ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ typescript๋ฅผ ํŒจ์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ typescript ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ TS๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์„ค์น˜๋˜๋Š” ๊ฒฝ์šฐ ํŒจ์น˜๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ง€์†์„ฑ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์„ธ๋ถ€์ •๋ณด: ts-patch /? )

ํŒจ์น˜ ๋กœ์ง์€ ๋Œ€๋ถ€๋ถ„ ttypescript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. (cevek์˜ ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ํฐ ๊ฐ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!) npm ํŒจํ‚ค์ง€ ์„ค์น˜ ํ”„๋กœ์„ธ์Šค์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒจ์น˜ ํ•ด์ œ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์€ typescript ์ž์ฒด์˜ ๊ด€๋ จ ํŒŒ์ผ์„ ์ง์ ‘ ํŒจ์น˜ํ•˜๋ฉฐ ๋ž˜ํผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ข…์†์„ฑ ์„ค์น˜ ํ›„ ํŒจ์น˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด typescript๊ฐ€ ๋ณ€ํ™˜๊ธฐ ์ค€๋น„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์ ์ ˆํ•œ ์ง€์›์„ ์ถ”๊ฐ€/ํ† ๋ก ํ•˜๊ธฐ ์œ„ํ•ด PR๋กœ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :)

์ด๋ด. ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” fuse-box๋ผ๋Š” ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์žˆ์–ด ๋งž์ถคํ˜• ๋ณ€์••๊ธฐ๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 4.0 ๋ฒ„์ „์ด ๊ณง ๋‚˜์˜ฌ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค... ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„ ์ง€์ ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‹น์‹ ์—๊ฒŒ๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/fuse-box/fuse-box/blob/master/docs/plugins/pluginCustomTransform.md

์ ์ ˆํ•œ ์ง€์›์„ ์ถ”๊ฐ€/ํ† ๋ก ํ•˜๊ธฐ ์œ„ํ•ด PR๋กœ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :)

TS ํŒ€์€ ์ด๊ฒƒ์„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์— ๋Œ€ํ•œ ๊ทธ๋“ค์˜ ์ด์œ ๋Š” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค!

์ข‹์€ ์†Œ์‹์€ TS๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค์ด๊ณ  ์ด๋ฏธ ๋ชจ๋“ˆ ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ts-patch๊ฐ€ ๋‚ด์žฅ๋œ ๊ฒฝ์šฐ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒจ์น˜์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ง€์›์„ ํ†ตํ•ด ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ๊ฑฑ์ •๋œ๋‹ค๋ฉด ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  TS์˜ ๋ชจ๋“  ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ์ž‘๋™ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค! ๋‚ด ์ƒ์—… ๊ธฐ๋ฐ˜ ์‹œ์„ค์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ด๋ฏธ ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•œ ํ›„ ts ํŒ€์ด ์ฃผ์ €ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€ํ™˜๊ธฐ๋Š” ์ปดํŒŒ์ผ ํ›„ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์›๋ž˜ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ƒˆ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ts-node --compiler ttypescript foo.ts ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ts ํŒ€์ด ๋‹ค๋ฅธ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ณ€ํ™˜๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋ฐ”์ธ๋”ฉ ๋‹จ๊ณ„๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ „๋ฅ˜ ๋ณ€ํ™˜๊ธฐ๋Š” ์ปดํŒŒ์ผ ํ›„ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์›๋ž˜ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ƒˆ ์ฝ˜ํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜๊ธฐ๋Š” TSC ์ปดํŒŒ์ผ ์ „์ด๋‚˜ ํ›„์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์€ ๋…ธ๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ํ›„ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋Šฅ์ด ๊ตฌ์ถ•๋˜์ง€ ์•Š์•˜์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ts.transform()์„ ํ˜ธ์ถœํ•˜๋ฉด ์ž‘์—…ํ•  ์ „์ฒด Program ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฒ€์‚ฌ๊ธฐ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CompilerHost๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด AST๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„ ์ˆ˜์ •๋œ ํŒŒ์ผ๋กœ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@nonara ttypescript ๋ฐ ts-loader`์™€ ํ•จ๊ป˜ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ๋‘˜ ๋‹ค ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์ง„์ž…์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” ์ƒˆ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ˆ„๋ฝ๋œ "๋ฌด์–ธ๊ฐ€"์™€ ์ƒˆ ๋ช…๋ น๋ฌธ์ด ์ตœ์ข… ์ถœ๋ ฅ ๋ฐฉ์ถœ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @weswigham ์€ ๋ณ€ํ™˜์ด ๋ฐ”์ธ๋”ฉ ํ›„ ๋‹จ๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ๋ถ„๋ช…ํžˆ ํŒŒ์ผ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ts-loader(ํŠนํžˆ ๋ณ€ํ™˜ ์ „์šฉ ๋ชจ๋“œ์— ์žˆ๊ณ  webpack/bundler ํŒŒ์ผ์„ ์™„์ „ํžˆ ์ˆจ๊ธธ ๋•Œ)์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋‹ค๋ฃฐ ๋•Œ ๋‘ํ†ต์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฆฌ์กธ๋ฒ„. ๊ฒฐ๊ตญ ์—๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ธ๋ผ์ธํ–ˆ์Šต๋‹ˆ๋‹ค .

@MeirionHughes ์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ˆ, Program ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ttypescript ๋Š” createProgram์„ ํ›„ํ‚นํ•˜์—ฌ ๊ฒฐ๊ณผ program ์˜ emit ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํฌํ•จํ•˜๋„๋ก ํŒจ์น˜ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ts.emitFiles ๋Š” ํ”„๋กœ์„ธ์Šค ์ค‘์— ts.transformNodes $๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ts.transformNodes ๋Š” Program ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ts.transform() ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ํ•˜๋‚˜ ์—†์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์œ ํ˜• ๋ฐ ๊ธฐํ˜ธ๊ฐ€ ์ด๋ฏธ ํ‘œ์‹œ๋˜๊ณ  AST ๋ณ€ํ™˜ ํ›„์— ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ฌธ์ œ๊ฐ€ ๋ฌถ์—ฌ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„ ์ €๋Š” ๋ณ€์••๊ธฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๊ณ  ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€์••๊ธฐ ํ•ธ๋“œ๋ถ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/madou/ts-transformer-handbook/blob/master/translations/en/transformer-handbook.md

์ž ์‹œ๋งŒ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

@madou ๋‚˜๋Š” ๋˜ํ•œ TS ๋ณ€์••๊ธฐ https://levelup.gitconnected.com/writing-typescript-custom-ast-transformer-part-1-7585d6916819 ์— ๋Œ€ํ•œ ๋ฌด๋ฆฌ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

typescript๋ฅผ ๋งŽ์ด ์‚ฌ๋ž‘ํ•˜์ง€๋งŒ ์ •์  ์œ ํ˜•๊ณผ ๋Ÿฐํƒ€์ž„ JS ๊ฐ„์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ํŠนํžˆ ํˆฌ๋ฐ•ํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์ž‘์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: https://github.com/dsherret/ts-nameof , https://github.com/kimamula/ts-transformer-keys - ํ•˜์ง€๋งŒ ์ผ๋ฅ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ง€์› ์—†์Œ). ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•œ ๊ธฐ์ˆ ์  ๊ฒฐ์ •์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๊ธฐ ์ „์— ์ž ์žฌ์ ์ธ ๋ฏธ๋ž˜ ์œ ํ˜• ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ๋†€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TypeScript ํŒ€์€ ๊ทธ๋“ค์˜ ์ฃผ์žฅ์„ ์žฌ๊ณ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋Š” ์–ธ์–ด๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์‹คํ—˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ์žฅ๋ คํ•˜๋Š” ์ž…์ฆ๋œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(ํ•˜์Šค์ผˆ์˜ pragma ์ฐธ์กฐ).

๊ทธ๋Ÿฌํ•œ ์‹คํ—˜ ์ค‘ ์ผ๋ถ€๋Š” ๊ฑฐ์น ๊ณ  ๋ฏธ์นœ ๊ฒƒ์ด ๋  ๊ฒƒ์ด๋ฉฐ, ์ผ๋ถ€๋Š” ๊ฒฐ๊ตญ ์•ˆ์ •ํ™”๋˜์–ด ์ผ๋ฐ˜ํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์ข‹์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ TypeScript ํŒ€์˜ ์œ„์น˜๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฒฝ์ง๋˜์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์ง€๋งŒ ๋” ์‰ฌ์šด ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ณ€ํ™˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด babel-plugin-transform-react-jsx-source ๋Š” ๊ธฐ๋ณธ ๋ฐ˜์‘ ๋ณ€ํ™˜ ์‚ฌ์ „ ์„ค์ •( @babel/preset-react )์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
๋ณ€์‹ ํ•œ๋‹ค

<sometag />

์•ˆ์œผ๋กœ

<sometag __source={ { fileName: 'this/file.js', lineNumber: 10 } } />

์ด ์ •๋ณด๋ฅผ ํ†ตํ•ด react ๋Š” ๊ฐœ๋ฐœ ์ค‘์— ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์Šคํƒ ์ถ”์ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typescript์˜ ๊ฒฝ์šฐ ์˜คํ”ˆ ์†Œ์Šค ๋ณ€ํ™˜์ด ์žˆ์ง€๋งŒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. https://github.com/dropbox/ts-transform-react-jsx-source

@mhegazy ๊ฐ€ TS ํŒ€์ด tsconfig์˜ ์ผ๋ถ€๋กœ "ํ”Œ๋Ÿฌ๊ทธ์ธ"์„ ํฌํ•จํ•  ๊ณ„ํš์ด ์—†๋‹ค๊ณ  ๋‘ ๋ฒˆ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹น์‹ ์€ PR์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ? ttypescript๊ฐ€ tsconfig๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€:

1) ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2) ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์‚ฌ์šฉํ•˜์—ฌ json์„ ๊ฐ€์ ธ์™€์„œ ๊ตฌ๋ถ„๋œ ๊ณต์šฉ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•์— ํ• ๋‹นํ•  ๋•Œ typescript๊ฐ€ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
3) css/yaml ๋ฐ ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ๊ธฐํƒ€ ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ
4) ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” graphql ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ
5) jsx๋ฅผ html ๋ฌธ์ž์—ด๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ innerHTML ์‚ฝ์ž… ๊ฐ€๋Šฅ
5) tsconfig ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ˆ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก์€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ API๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ์ฐฉ๋ฅ™ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. "tsconfig"์˜ "ํ”Œ๋Ÿฌ๊ทธ์ธ" ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด tsc๊ฐ€ ์ •๋ง ๊ฐ•๋ ฅํ•ด์ง‘๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ํฐ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ๋งŽ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” typescript ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ https://github.com/atlassian-labs/compiled-css-in-js ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿค™ ์†Œ๋น„์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ›„ํ”„๋ฅผ ๊ฑด๋„ˆ๋›ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š” Typescript ํŒ€, ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์งˆ์งˆ ๋Œ์ง€ ๋ง์•„์ฃผ์„ธ์š” <_<

์ด์— ๋Œ€ํ•œ ์ƒํƒœ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ƒํƒœ?

์นœ๊ตฌ ๋ฌด์Šจ ์†Œ์‹?

typescript ํŒ€์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๋„๊ตฌ๊ฐ€ ํ•ต ์—†๋Š” ์˜ต์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋Œ€์‹  babel์„ ์‚ฌ์šฉํ•˜๊ณ  typechecking์—๋งŒ typescript๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

typescript ํŒ€์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๋„๊ตฌ๊ฐ€ ํ•ต ์—†๋Š” ์˜ต์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋Œ€์‹  babel์„ ์‚ฌ์šฉํ•˜๊ณ  typechecking์—๋งŒ typescript๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚น์„ ์›ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋งˆ์ˆ ์„ ๋งŒ๋“œ๋Š” ์ž‘์€ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

type Human = {
    name: string,
    age: number
}

const isValid = check<Human>({ name: 'Carl', age: 16 }) // => true
const isValid = check<Human>({ name: 'Carl' }) // => false

check ํ•จ์ˆ˜๊ฐ€ ํŠน์ • type-guard ํ•จ์ˆ˜๋กœ ๋ณ€ํ˜•๋˜์—ˆ์Šต๋‹ˆ๋‹ค! Babel๋กœ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ๋Š” ttypescript๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

typescript ํŒ€์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋‚˜์€ ๊ฐœ๋ฐœ ๋„๊ตฌ๊ฐ€ ํ•ต ์—†๋Š” ์˜ต์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋Œ€์‹  babel์„ ์‚ฌ์šฉํ•˜๊ณ  typechecking์—๋งŒ typescript๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— ์ง€์›๋  ๊ฒƒ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ๋กœ ์ด๋ฏธ ์ง€์›๋ฉ๋‹ˆ๋‹ค. TypeScript ์ปดํŒŒ์ผ๋Ÿฌ API๋Š” ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ง€์›ํ•˜๋ฉฐ ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ _์ •๋ง_ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ttypescript ๋˜๋Š” ts-patch ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณ€ํ™˜๊ธฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณด๊ฐ•ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์‹ค์ œ๋กœ "ํ•ดํ‚น"์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ API์˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ tsc ์— ๋…ธ์ถœํ•˜์—ฌ tsconfig๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@ilya-buligin ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์ฃผ๋ณ€ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

declare const check: <T>(value: unknown) => value is T;

const isValid = check<Human>({ name: 'Carl', age: 16 }) // => true

Typescript๋Š” check ์œ ํ˜• ์ •์˜์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

@just-boris Babel์—์„œ ์ผ๋ฐ˜ ์œ ํ˜• <T> ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ๋Š” ์ƒ๋‹นํžˆ ๋ฐ˜๋ณต์ ์ด๊ณ  ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. @RyanCavanaugh ์ฃผ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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