#13764๊ฐ ์ถ์๋ ์ดํ๋ก ์ปค์คํ ํธ๋์คํฌ๋จธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ API๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ๋จ์ผ ๋ณํ๊ธฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ ์ฒด tsc ๋ช ๋ น์ค์ ๋ณต์ ํด์ผ ํฉ๋๋ค. ์ด๋ typescript์ ๋ฐ๋ผ ์์ฉ ํ๋ก๊ทธ๋จ์ด tsc ๋ช ๋ น์ค ๋๊ตฌ์ ๋์ผํ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋นํธํ์ฑ์ ์ด๋ํฉ๋๋ค.
๋ฐ๋ผ์ ์ธ์ด ์๋น์ค ํ๋ก์ #12231์ ๊ฒฝ์ฐ์ ๊ฐ์ด ํ์ฌ ๋ ธ๋ ๋ชจ๋์์ ์ฌ์ฉ์ ์ง์ ๋ณํ๊ธฐ๋ฅผ ๋ก๋ํ ์ ์๋ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ณํ๊ธฐ๋ ๊ธฐ์กด ๋น๋ ๋๊ตฌ/๋น๋ ์ํฌํ๋ก์ ์ฝ๊ฒ ํตํฉ๋ฉ๋๋ค.
๊ฒฝํ์ด ์๋ ์ฌ๋์ด ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉด ๋ด ํ๋ก์ ํธ๋ฅผ ์์ฒญ๋๊ฒ ๋จ์ํํ ์ ์๋ PR์ ๋ง๋ค ์ํฅ์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋จ๊ธฐ์ ์ผ๋ก ์ปดํ์ผ๋ฌ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ๊ณต๊ฐํ ๊ณํ์ด ์์ต๋๋ค. ๋ณํ์ ๊ทํ๊ฐ ์ธ๊ธํ ๋๋ก ๊ณต๊ฐ 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๋ ๋์ค์ ์ด๊ฒ์ ๊ตฌ์ฑํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ํ์ฌ ๊ฐ๊น์ด ์ฅ๋์ ์ด๊ฒ์ ์ถ๊ฐํ ๊ณํ์ด ์์ต๋๊น?
์๋ ๋ชจ๋, ๋๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ์๋ฌด๊ฒ๋ ๋์ค์ง ์์ต๋๋ค :[
์ฌ์ค ๋ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
// 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์์์ ๊ฐ์ด ๋ณ์๊ธฐ ์ง์ ๋ฐ ์ํฌํ๋ก๊ฐ ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋๋ ๊ฒ์ ๋๋ค.
์ ๋ ์ด ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ๋ง์ต๋๋ค.
@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 ์ฌ์ฉ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค.
https://github.com/Microsoft/vscode-typescript-tslint-plugin
git clone https://github.com/zpdDG4gta8XKpMCd/code-gen.git
์คํcode-gen
ํด๋๋ก ์ด๋: cd ./code-gen
1-install.bat
2-build.bat
3-install-some-more.bat
4-try.bat
test.ts
๋ก ์ด๋( Ctrl + P
-> test.ts
)interface Data {
one: string;
another: number;
}
function gen<_T>() {
return function (meh: any) {};
}
@gen<Data>()
export class Gen {
}
@gen<Data>()
์๋์ ๊ตฌ๋ถ๊ตฌ๋ถํ ์ ์ ๊ด์ฐฐํ์ญ์์ค.
Quick fix...
์ ํ -> Needs a rewrite, wanna fix?
์๋ ์์ฑ ์ฝ๋ ๊ด์ฐฐ:
์ฌ๊ธฐ์ ์ฐธ์กฐ๋ฅผ ์ํด 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๋ฅผ ์ฒ๋ฆฌํ๋ ์ ์ ํ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ์ด๊ฒ์ ์ฃผ์ ๊ฒฐํจ์ด ์๋๋ฉฐ "๊ณผ์ค"์ ๋ฐ์ํ์ง ์์ต๋๋ค. ์์๋ฅผ ์ง์ผ์ฃผ์ธ์.
์ค, ์ ๋ฐ ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ธ์. ์ด๊ฒ์ ์ ๊ฐ ํญ์ ๋ถ๋ง์ ์ ๊ธฐํ๋ ๋ฐฉ์์ ๋๋ค. ์ ๋ ์ฑ๊ฒฉ์ด ๋งค์ฐ ์ข์ง ์์ต๋๋ค(๊ฑด๊ฐ ์ํ). ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ ๊ฐ ์ ์์ ์ ์ง๋ผ ์ ์๋ ์ต์ ์ ๋๋ค, ์ ๋ง ์ฃ์กํฉ๋๋ค
๋น์ ์ ๋๋ฅผ ๋๋ผ๊ฒํ๋ ๊ฒ์ ๋ฉ์ถ์ง ์์ ๊ฒ์ ๋๋ค
@zpdDG4gta8XKpMCd ์ค์ ๊ตฌํ์ ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ์ต๋๊น? TypeScript๋ ์คํ ์์ค์ ๋๋ค. ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํ๋ค๋ฉด(๋ถ๋ถ์ ์ผ๋ก๋ผ๋) ํ ๋ฆฌํ์คํธ๋ฅผ ์ง์งํ๊ฒ ๊ณ ๋ คํ ๊ฒ์ด๋ผ๋ ๋ฐ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
๋น์ ์ ๋ฌด๋กํจ์ ์ํ์ ์ํ๋ก ๋น๋ํ๋ ๊ฒ์ ์ฉ๋ฉ๋ ์ ์์ต๋๋ค. ๊ทํ๊ฐ ์ ๋ ฅํ๊ณ ์๋ฐ์ ์ผ๋ก "๋๊ธ"์ ํด๋ฆญํ๊ธฐ๋ก ์ ํํ ๋จ์ด์ ๋๋ค. ์ด๋ค ์ง๋ณ๋ ๋น์ ์ ๊ทธ๋ ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค. ํ์ดํ์ด ์๋๋ผ ๋งํ์ธ์. ๋น์ ์ ๋ํ ๊ทธ๊ฒ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋น์ ์ ์ฝ๋ฉํธ๋ฅผ ํธ์งํ ๊ธฐํ๊ฐ ์์์ง๋ง ๋น์ ์ ๊ทธ๋ ๊ฒ ํ์ง ์์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ๋ณํ๊ธฐ๊ฐ _now_ ํ์ํ ๊ฒฝ์ฐ Babel์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฑฐ์ ๋ชจ๋ TypeScript์์ ์ ํ ์ฃผ์์ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ ์ํ๋ ๋๋ก ๊ตฌ๋ฌธ ๋ณํ์ ํ์ฉํฉ๋๋ค. ๋ณด๋์ค๋ก ์๋๋ ๋นจ๋ผ์ง๋๋ค.
Microsoft์ ์ ์ฅ์์์ ์๊ตฌ์ ์ผ๋ก ์ซ๊ฒจ๋๊ธฐ ์ ์ ๋๊ธ ์์ฑ์ ์ค๋จํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ด repo๋ผ๋ฉด, โโ๋น์ ์ ๋ง์ง๋ง ๋นจ๋์์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๋๋ค.
์์์ด, ๋ ๋ ์ซ์๋์ด, ๊ทธ๋ผ ์ด์ฉ์ง
๋ด๊ฐ ๋์์ฌ ์ ์์๊น? ์ ๊ณ์ ์ ๋ง๋ค ์ ์์ต๋๊น?
๋ด๊ฐ ์ด ๊ณ์ ์ ๋๋ฌด ์ ๊ฒฝ ์ฐ๋ ๊ฒ ๊ฐ์?
์ด์จ๋ , ์, ์ ๋ pull ์์ฒญ์ ์๋ํ์ง๋ง ๋ถํํ๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
๋น์ ์ด ํด๊ฒฐํ ์ ์๋ ํน์ ๋ฒ์ฃผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ๋ค์ ์ฌ์ํ๊ณ ๋ ๊ด์ฌ์ด ์๋ ๊ฒ์ ๋๋ค. ์ด์ ๊ฐ์ด ์ฌ๊ฐํ ๋ฌธ์ ๋ ์๋๋๋ค.
์ค์ค๋ก ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ ๋ฌธ์ (224๊ฐ์ ์์ง์๊ฐ๋ฝ์ ๋ค์ด๋)๋ ๊ณ ๋ คํ๋ค๋ฉด ๋ช ๋ ์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
์ด ์ข๊ฒ๋ ๋น์ ์ ๋น์ ์ด ๊ฐ์ง ์๋จ์ ์ฌ์ฉํ์ฌ ์ค๋ ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ ์๊ณ ๋ณผ ์ ์๋ ์ฐจ์ด๋ฅผ ๋ง๋ค๊ธฐ ์์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์(์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค๊ณ ๋๋ฅผ ๋น๋ํ์ง ๋ง์ญ์์ค)
@zpdDG4gta8XKpMCd ์์๋ค์ํผ ์ ๋ ๋ช ๋ ๋์ ๋์์ ์ธ ํ ์ดํฌ์ ํฌ์ด์์ต๋๋ค. ์ ๋ ์ฌ๊ธฐ์์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋์ํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ๋ฅผ ์ ์คํ๊ณ ์ ์คํ๊ฒ ์ ์งํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ถ์ ํ๋ ๋ชจ๋ ์ฌ๋์ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ํญ์ ์๊ธฐ์์ผ์ค๋๋ค.
@Janpot ๋ค , WIP์ ๊ฐ๊น์ง๋ง @rbuckton ์ด ๋์์ค๋ฉด ์ํ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํ๋ฌ๊ทธ์ธ ํฌ์ธํธ๋ฅผ ์กฐ์ฌํ ๋(3.5 ๋ฐ๋ณต ๊ณํ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ) ์ฌ์ฉ์ ์ง์ ๋ณํ๊ธฐ์ ๋ํ ๋ ์ฌ์ด ํํฌ๋ฅผ ๋ ธ์ถํ๋ ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํ๊ณ ์ถ์ ์ฃผ์ ์๋๋ฆฌ์ค๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋ฐ๋์ ๋ ธ๊ณจ์ ์ผ๋ก ํ์ง ์์ ์ด์ ๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํฌํจํ๋ ๋ ๊ด๋ฒ์ํ ์์ ์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ ๋งํด์, ์๋ง๋ ์ฌ์ ๋ฐ ์ฌํ ํธ๋์คํฌ๋จธ๋ณด๋ค ๋ ๊ด๋ฒ์ํ ๊ฒ์ด ์์ ์ ์์ต๋๋ค.
@DanielRosenwasser ๊ทธ๋ค์ง ๋์์ ์ด์ง ์๊ณ ๋ฑ 2๋ง๋๋ง ํ๊ณ ๊ทธ ์ ์ ๋ํด ์ง์ฌ์ผ๋ก ๋ฏธ์ํ๋ค๊ณ ๋งํ๋ค
์ด์จ๋ , ์์ ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ํฉ์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง์ ๋ํ ๊ฑด์ ํ ์ข์ ์ ์๋น ๋ถ๋ถ์ด ์๋ค๋ ๋ฐ ๋์ํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋น๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ํ๋ก์ ํธ๋ฅผ ์ถ์งํ๋ ์์ธ์ ์ดํดํฉ๋๋ค
ํ์ง๋ง ์ฐ๋ฆฌ์ ๊ด์ ์์ ๋ณด๋ฉด ๋น๋ํ ์ฌ๋์ด ์์ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ช ๋ ์ ๊ฑธ์ณ ๋ฐฉ์นํ๋ ๊ฒ์ด ๋ ์์ฐ์ ์ด์ง ๋ชปํ ์ด์ ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ฏธ๋ฃจ๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ ๋จผ์ ์ง์คํ ์ด์ ๊ฐ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฒญ์ค์๊ฒ ๋งค์ฐ ์ํ๋ ํน์ ๊ธฐ๋ฅ์ด ์ถฉ์กฑ๋์ง ์๋ ์ด์ ๋ฅผ ์๋ ค์ฃผ๋ฉด ๋ ์ข์ ๊ฒ์ ๋๋ค. ์ข์ ์ ์ ๋๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋๋์ด ๋ํ๋ฅผ ์ธ๊ธํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค : https://github.com/Microsoft/TypeScript/issues/30696#issuecomment -478799258
์์ง์๊ฐ๋ฝ์ ์น์ผ์ธ์ด๋ค๊ณ ํด์ ์๋ก์ด ๋ฆฌ์์ค๊ฐ ๊ฐ์๊ธฐ ์ฐฝ์ถ๋์ง ์๊ณ , ๋ณต์กํ๊ณ ์ด๋ ค์ด ๊ฒฐ์ ์ ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ๋ด๋ฆฌ๊ฑฐ๋, ๊ธฐ์กด ๋น์ฆ๋์ค ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ๊ณ , ์งํ ์ค์ธ ํ๋ก์ ํธ๋ฅผ ์ค๋จํ๊ณ , ๋ค๋ฅธ ์์ ์ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ๊ฑฐ๋, ์ง๋์น๊ฒ ์ผ์ฌ์ฐฌ ์ ์์ด ๋ฒ์๋ฅผ ๋ํ๊ฑฐ๋, ์ด์ ์ ๋ง์ถ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๋๋ก ๊ด๋ฒ์ํ๊ณ ์๊ตฌ์ ์ธ ์ํฅ์ ์ฃผ๋ ์ ์์ ๋ณ๊ฒฝํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด์ ๊ฐ์ด ๋งค์ฐ ๋ณต์กํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ง์ด ํ์ํ ์์ ์ ์์ ์ ์๋ ค์ง ํ๋ฅญํ๊ณ ๊ฐ๋จํ ์์ ์ ๋ฏธ๋ฆฌ ์ํ(๋๋ ์ ๋ํ PR ํ์ฉ )ํ ๊ฒ์ ๋ํด ์ฌ๊ณผํ์ง ์์ต๋๋ค. ์งํ์ค์ ๋ฆฌ๋ชจ๋ธ๋งํ๊ณ ์ง ๊ผญ๋๊ธฐ์ ๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ฅผ ์ถ๊ฐํ ๊ณํ์ด ์์ง ์งํ ์ค์ธ ๋์ ๋๊ตฐ๊ฐ๊ฐ ์์ ์๋ ์๋๊ผญ์ง๋ฅผ ์๋ฆฌํ๊ฒ ํ๋ ค๋ ์ด์ ๋ฅผ ์ถ์ธกํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ ๊ฒ์ ๋๋ค.
@zpdDG4gta8XKpMCd ์ ๋๊ตฐ๊ฐ๋ฅผ ํํด์ผ ํฉ๋๊น? ์ ์ด์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด PR์ ํ์ง ์์ ์์ ์ ํํ์ง ์๊ฒ ์ต๋๊น? ๋๋ ๊ตฌํ ๊ด์ ์์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฑด์ค์ ์ธ ๊ธ์ด ์์ต๋๊น?
์, ๋ฐฉ๊ธ ๋งํฌํ ํฌ๋ช ํ ๊ธ์ ์ฐ๊ณ ๋ 2์ฃผ ๋ง์ ๊ณฐ์ ๋ค์ ์ฐ๋ฅด๊ธฐ๋ก ํ์ จ์ด์? 1500๊ฐ ์ด์์ ์์ ์ด ์๋ ๊ทธ ์์น์ ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ์ค ๋ช ๊ฐ์ง๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ ํ์์๋ 100๊ฐ ์ ๋์ ์์ ์ ์ฎ๊ธฐ๊ณ ์๋นํ ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค. 15๋ฐฐ๋ ๋ ๋ง์ ์ค์ ์์๋ ๋ชปํจ ๐ฎ
@FredyC ๋ง์์ฌ, ๋ด๊ฐ ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค๊ณ ๋งํ๊ธฐ ์ ์ ๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ด
์, ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ณต์์ ์ธ pull ์์ฒญ์ ํ์ง ์์ต๋๋ค.
๋๋ ์ข์ ๊ฒ์ ๋ง๋๋ ์์ค์ ์์ง ์๋ค
๊ฐ๋จํ ์น์ธ์ ๊ฒฝ์ฐ ๊ธด ์ค์ ์์ผ ํ๊ณ 2๋ ์ ์ ์์ฑ๋ pull ์์ฒญ์ ํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ก ์ต์ ์ํ๋ก ์ ์งํ๋ ค๋ฉด ์์ฒญ๋ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค. ์๊ฐ์ด ๋ง์ง ์์ต๋๋ค.
Anders hejlsberg์ ๊ฐ์ ์์์ ์ฌ๋๋ค๋ง์ด ์๊ณ ์๋ ๊ฑฐ๋ํ ์ค๊ณ ๊ณ ๋ ค ์ฌํญ์ ๊ณ ๋ คํ ๋ ํน์ ๋ฌธ์ ๋ ๊ณ ๋ ค์กฐ์ฐจ ๋์ง ์์ ๊ฒ์ ๋๋ค.
๋น์ ์ ์ข์ ๋ถ๋ถ์ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค, ๊ทธ๋ฆฌ๊ณ ๋๋ ์ฌ๊ธฐ์ ํผ์๊ฐ ์๋๋๋ค
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ธ์ด ์์ฉํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ด ์ฌ๋ฃ๋ค์ ์์ด์ ๋ด๋ฆฐ ๊ฒฐ์ ์ด ์กฐ๊ธ ๋ ๋ช ํํ๋ค๋ฉด ๋ ์ข์์ ํ ๋ฐ
๋ ๋๋ฌ์ด ๋๋ฌด ๊ฐ์ด ์์ฒ๋ฐ์ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๋ฏธ์ํ์ง๋ง ๋๋ ์๋ฌด ๋ง๋ํ์ง ์์๊ฑฐ์ผ
https://github.com/Microsoft/TypeScript/issues/14419#issuecomment -483920640์ ์ฐ์
๋ ๋ค๋ฅธ ์ต์
์ ํจ์ ์ ์ธ ์์ฒด๋ฅผ ๋ง์ปค๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์๋๋ ์ด๋ฆ์ด toRandom...
๋ก ์์ํ๋ ํจ์์ ๋ํ ์ฝ๋ ์์ฑ๊ธฐ์ ๊ตฌํ์
๋๋ค.
์์ฑ๊ธฐ์ ์ ๋ณด ์์ค๋ ํจ์์ ๊ฒฐ๊ณผ ์ ํ์ ๋๋ค.
์ด๊ฒ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค:
toRandom...
๋ก ์์ํ๋ ํจ์ ์๋์ ๊ตฌ๋ถ๊ตฌ๋ถํ ์ ์ ํ์ธํ์ญ์์ค.๋ค์์ ์ด๋ฅผ ์ํํ๋ 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 ์ธ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋:
๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ ์์ ๋ค๋ฅธ ๊ฒ์ ์ถ๊ฐํ๊ณ ์ถ์ง ์์ต๋๋ค
๋ด ์ฝ๋ ๋ณํ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์ฐ๋ฆฌ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋งคํฌ๋ก๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค: #4892
๋ด ๋ฉํฑ์ ๋ง์ typescript ์ธ์ด ์๋น์ค๋ง ๋ณด์ ํ ์ ์์ผ๋ฉฐ ๊ทธ ์ค ์ผ๋ถ๋ ์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ๋์ vscode
- ํ๋ by tslint
@zpdDG4gta8XKpMCd ๋ชจ๋ ๊ฒ์ด ๋์ผํ ์ธ์ด ์๋น์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋จ์ผ ์ธ์ด ์๋น์ค๊ฐ ์๊ณ ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป tslint ํ๋ฌ๊ทธ์ธ์ด ์ด๋ฅผ ํ๋ก์ํฉ๋๋ค.
Btw, ์ฌ๊ธฐ์์ ์ํํ๋ ค๋ ์์ ์ด ์ฌ๊ธฐ ์์ ์ํ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์ธ์ด ์๋น์ค ํ๋ฌ๊ทธ์ธ์ผ๋ก ํ์คํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์ด์จ๋ , ์ฌ๊ธฐ์์๋ ํธ์ง๊ธฐ ์ฝ๋ ๋ณ๊ฒฝ/์ธ์ด ์๋น์ค ํญ๋ชฉ์ด ์๋ tsc
๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ ์ผ๋ถ๋ก ์ฌ์ฉ์ ์ ์ ๋ณํ๊ธฐ์ ๋ํด์๋ง ์ฃผ์ ์ ๋ํ ๋ํ๋ฅผ ์ ์งํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ ์ฒด ํ๋ก์ ํธ์์ ๋ณํ์ ์ํํ๋ ์๋ฃจ์
์ ์ฐพ๊ณ ์์ผ๋ฉฐ ํธ์ง๊ธฐ ๋ด์์ ์ํํ๋ ๊ฒ์ ์คํ ๊ฐ๋ฅํ ์๋ฃจ์
์ด ์๋๋๋ค(ํนํ ํด๋น ์์ ์์ ๋ณํ์ ์ํํ๋ ๊ฒ์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฌดํจํํ๊ธฐ ๋๋ฌธ์). ์ด์์ ์ผ๋ก ์ฌ๊ธฐ์์ ๊ตฌํ๋์ด์ผ ํ๋ ๊ฒ์ ํธ์ง๊ธฐ/tsserver ๋๋ ์ธ์ด ์๋น์ค์ ๊ด๋ จ์ด ์์ด์ผ ํฉ๋๋ค.
์์คํ ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค ๊ณ ๋ คํ๊ฒ ์ต๋๋ค
tsc
๋น๋์ ์ผ๋ถ๋ก ์ฌ์ฉ์ ์ ์ ๋ณํ๊ธฐ์ ๋ํด์๋ง ๋ํ๋ฅผ ์ ์งํ๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค.
๋ด ์ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ผ๋ก ๋ช ํํ๊ฒ ๋ ์ด๋ธ์ด ์ง์ ๋์ด ์์ต๋๋ค(๋์์ธ ํ์ด ์ ์ ํ ์๋ฃจ์ ์ ๋ํด ๋ ์ด์ฌํ ์๊ฐํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ๋ ๋์). ๊ทธ๋ ๋ค๋ฉด ์ ์ ๋ ๊น์?
๋ค๋ฅธ ๊ณณ์์ ํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ ๋ค๋ฉด ๋ง์ํด ์ฃผ์ญ์์ค.
ํ์ง๋ง ํ๋ ๊ฒ์ ๋ํ ๊ทํ์ ์ฐ๋ ค๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
์ ์ฒด ํ๋ก์ ํธ์ ๊ฑธ์ณ ๋ณํ
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 ์
๋ ฅ ๋ฌธ์์ด ๋ถ์โฆ
์ฝ๊ฐ์ ์:
์ถฉ๋
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 ์ฃผ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ ๋๊น์ง ์ด ์ค๋ ๋๋ฅผ ์ ๊ฐ์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ ธ์ถ๋ ํ๋ฌ๊ทธ์ธ API๋ฅผ ์ํ์ง ์์ต๋๋ค. ๋์ TS-Compiler API๋ฅผ ์ฌ์ฉํ๋ ๋์ tsconfig.json์ ์ง์ ํ์ฌ ์ฌ์ฉ์ ์ง์ ๋ณํ์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ ํธํฉ๋๋ค. TS-Compiler API๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ ์ด์ tsc ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๊ธฐ์กด ๋น๋ ๋๊ตฌ ๋ฐ ์ํฌํ๋ก์ ์ ๋๋ก ํตํฉ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค.