Typescript: ๋ฐฉ์ถœ์€ ๋นˆ ์ค„์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”,

TS ๋ฒ„์ „ : 1.1

์ฃผ์–ด์ง„

function foo() {

    var x = 10;

    var y = 11;
}

์šฐ๋ฆฌ๋Š”

function foo() {
    var x = 10;

    var y = 11;
}

์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ค„ ๋ฐ”๊ฟˆ์ด ์—†์Šต๋‹ˆ๋‹ค.

function foo() {
    var x = 10;
    var y = 11;
}

(๋‘ ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋‘ ์ฒซ ๋ฒˆ์งธ ๋นˆ ์ค„์„ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ์ƒˆ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ”์Šต๋‹ˆ๋‹ค.)

์ด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๋ฅผ ๋””๋ฒ„๊น… ํ•  ๋•Œ ๊ฒฝํ—˜์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Bug help wanted

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

๊ตฐ์ค‘์€ preserveWhitespace: true/false ์›ํ•ฉ๋‹ˆ๋‹ค
@ORESoftware ++

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

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

@NoelAbrahams ๋””๋ฒ„๊น… ํ•  ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@ahejlsberg @NoelAbrahams ์ €๋Š” ์›๋ž˜ CodePlex ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด ๋ณด๋‚ธ ํ”„๋กœํ†  ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์‹ค์ œ๋กœ ์ฃผ์„๊ณผ ์ค„ ๋ฐ”๊ฟˆ ๋ณด์กด์œผ๋กœ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ฒŒ ์žฌ ์ž‘์„ฑ๋œ ๊ตฌ์กฐ (์˜ˆ : ํ•จ์ˆ˜ ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜)์—์„œ๋„ ๊ฑฐ์˜ ํ•ญ์ƒ ์ง๊ด€์ ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ค„ ๋ณด์กด์€ ๋Œ€๋ถ€๋ถ„ ์ด์ „ ์ฝ”๋“œ๋ฅผ ๋ณด์กด ํ•  ๋•Œ ์ค„ ๋ฐ”๊ฟˆ์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ ํ•  ๋•Œ ์ƒ๋Œ€ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์ด์žˆ๋Š” ๊ฒฝ์šฐ :

module M {
}
module N {
}

๊ทธ๋Ÿฐ ๋‹ค์Œ 'N'์— ๋Œ€ํ•œ IIFE๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ "์šฐ๋ฆฌ๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“ˆ๊ณผ ์ด์ „ ๊ตฌ๋ฌธ ์š”์†Œ ์‚ฌ์ด์— ํ€ด์ฆˆ๋ฅผ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋†’์€ ์ˆ˜์ค€์˜ ์ถฉ์‹ค๋„๋กœ ์ฃผ์„ / ๊ฐœํ–‰์„ ๋ณด์กดํ•˜๋Š” ์ด๋ฏธ ํ„ฐ ํ”„๋กœํ†  ํƒ€์ž…์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์ „ / ์ดํ›„์ž…๋‹ˆ๋‹ค.

https://typescript.codeplex.com/SourceControl/latest#tests/Fidelity/emitter2/ecmascript5/Parser.ts
https://typescript.codeplex.com/SourceControl/latest#tests/Fidelity/emitter2/ecmascript5/Parser.ts.expected

์—ฌ๊ธฐ์—์„œ๋„ ๋งŽ์€ ์˜ˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://typescript.codeplex.com/SourceControl/latest#tests/Fidelity/emitter/ecmascript5/

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์œ ์ผํ•œ ๊ธฐ๋Šฅ์€ '์ •๋ ฌ'์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์›๋ณธ์—์„œ ์–ด๋–ค ๋ฐฉ์‹ ์œผ๋กœ๋“  ์ •๋ ฌ ๋œ ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ (๋งค๊ฐœ ๋ณ€์ˆ˜ ์„ ์–ธ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ) ๋‚ด ๋ณด๋‚ธ ์ฝ”๋“œ๋„์ด๋ฅผ ๋ณด์กดํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‚ฌ์†Œํ•œ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, TS์—์„œ JS ๋กœ์˜ ์ปจ์Šค ํŠธ๋Ÿญ ํŠธ ๋ณ€ํ™˜์€ ๋“ค์—ฌ ์“ฐ๊ธฐ๋ฅผ ๋ณด์กดํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://typescript.codeplex.com/SourceControl/latest#tests/Fidelity/emitter/ecmascript5/ClassDeclaration/ClassDeclaration2.ts
https://typescript.codeplex.com/SourceControl/latest#tests/Fidelity/emitter/ecmascript5/ClassDeclaration/ClassDeclaration2.ts.expected

์ค‘์ฒฉ ๋œ ๋ชจ๋“ˆ๊ณผ ํด๋ž˜์Šค๋ฅผ IIFE๋กœ ๋ณ€ํ™˜ ํ•œ ํ›„์—๋„ ๋ฌธ์ด ์–ด๋–ป๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ๋“ค์—ฌ ์“ฐ๊ธฐ๋˜๋Š”์ง€ (์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„) ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

@ahejlsberg , ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋””๋ฒ„๊น… ํ•  ๋•Œ ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ TypeScript ์†Œ์Šค ์ฝ”๋“œ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ JavaScript ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ค‘๋‹จ ์ ์„ ์„ค์ •ํ•˜๊ธฐ์œ„ํ•œ ์ค„์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋นˆ ์ค„์—†์ด ์‚ด ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ TS๋Š” _beautiful _ JavaScript (: smile :)๋ฅผ ๋ณด์กดํ•˜๊ณ  ๋ฐฉ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ

@ahejlsberg @NoelAbrahams ์ด ๋Œ€ํ™”์™€ ์•ฝ๊ฐ„ ๊ด€๋ จ๋œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋””๋ฒ„๊น…์— ์กด์žฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. setter / getter ์ฒด์ธ (์˜ˆ : jquery) ๋˜๋Š” ์ฒด์ธ ์•ฝ์†์„ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ ์ค„ ๋ฐ”๊ฟˆ์€ ๋ฒˆ์—ญ ์ค‘์— ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, Arrow ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์—… ํ•  ๋•Œ ํฐ ๊ณ ํ†ต ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋กœ์„œ:

(<any> x).a('#test')
    .b('test')
    .c(() => 'foo')
    .d(() => 'bar')
    .e(() => 5)
    .f(() => 6);

๋œ๋‹ค :

x.a('#test').b('test').c(function () { return 'foo'; }).d(function () { return 'bar'; }).e(function () { return 5; }).f(function () { return 6; });

Chrome ๋ฐ sourceMaps๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋‹จ ์ ์„ ๊ณ„์† ๊ฑด๋„ˆ ๋œ๋‹ˆ๋‹ค.

http://www.typescriptlang.org/Playground#src = (% 3Cany % 3E % 20x) .a ( '% 23test') % 0A % 20 % 20 % 20 % 20.b ( 'test') % 0A % 09.c (() % 20 % 3D % 3E % 20'foo ') % 0A % 09.d (() % 20 % 3D % 3E % 20'bar') % 0A % 09.e (() % 20 % 3D % 3E % 205) % 0A % 09.f (() % 20 % 3D % 3E % 206) % 3B

@mtraynham , ์‹ค์ œ๋กœ ๊ฐ•์กฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์—์„œ ์ธ๋ผ์ธ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์€ ํ•ญ์ƒ ์ƒˆ ์ค„์—์„œ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

// TS
var x = () => 'foo';

// JS - old
var x = function () { 
             return 'foo'; 
       };

// JS - new
var x = function () { return 'foo'; };

๋‚˜๋„ ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋””๋ฒ„๊น… ํ•  ๋•Œ ์ค‘๋‹จ ์ ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๋” ๋Œ์•„๊ฐ€์„œ function ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@NoelAbrahams Ahh ์˜ˆ, ๋˜‘๊ฐ™์€ ์ž„์‹œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ์— # 2259๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ํƒ€์ดํ”„ โ€‹โ€‹์Šคํฌ๋ฆฝํŠธ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ํƒ๊ตฌํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๋ง ๋””๋ ‰ํ„ฐ๋กœ์„œ ์ƒˆ๋กœ์šด ๋ผ์ธ ๊ธฐ๋Šฅ์ด ์ •๋ง ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. typescript์˜ ์ฃผ์š” ๋งค๋ ฅ ์ค‘ ํ•˜๋‚˜๋Š” typescript generatedJavascript์—์„œ ์ƒ์„ฑ ๋œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ ์—…๋ฐ์ดํŠธ ๋ฐ "--removeComments"๋ช…๋ น ์ค„ ์ง€์‹œ๋ฌธ ์ถ”๊ฐ€์— ์ฃผ์„์ด ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ @timjmartel ๊ณผ ๋น„์Šทํ•œ ์ด์œ ๋กœ ์ด๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‚ด ๋ณด๋‚ธ JS๊ฐ€ _nice_ ๋ณด์ด๋ฉด ์ฑ„ํƒ์— ๋Œ€ํ•œ ์ €ํ•ญ์ด ์ ์Šต๋‹ˆ๋‹ค. (์ ์–ด๋„ ์ˆ˜์ง์  ์ธ) ๊ณต๋ฐฑ์„ ๋ณด์กดํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธฐ๊ณ„์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ๊ฒƒ๋ณด๋‹ค ๋œ ์ธ๊ฐ„์ด ์ž‘์„ฑํ•œ idomatic JS ์ฝ”๋“œ์™€ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€์ด TS๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋Œ€์‹  ํŠธ๋žœ์Šค ํŒŒ์ผ ๋œ JS๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ธ๊ฐ„ ์นœํ™”์  ์ธ ๊ณต๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ๋ฐฉ์ถœ ๋œ JS ์†Œ์Šค๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋นˆ ์ค„๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์ง€๊ธˆ ๋‹น์žฅ์€ ํžˆํŠธํ•˜๊ฑฐ๋‚˜ ๋†“์น˜๋”๋ผ๋„ ๋ฐฉ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์‹คํ—˜์  ๊ธฐ๋Šฅ์€ "--keepEmptyLines"์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ JS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์ฝ๊ธฐ ์‰ฌ์šด JS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋‹จ ์ ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ์ค„์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ,์ด ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ "์ ์ค‘ ๋˜๋Š” ์‹คํŒจ"ํ•ญ๋ชฉ ์ธ ๊ฒฝ์šฐ "--oneCallForLine"์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ชฉ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์†Œ์Šค ์ฝ”๋“œ ๋ฏธํ™” ์ž์— ์˜ํ•ด ๋ถ„ํ•  ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ TypeScript์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. tsconfig.json์— ์˜ต์…˜ ๋งŒ ์žˆ์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

preserveWhitespace: true/false

?

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ๋ณด์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค : https://www.typescriptlang.org/docs/handbook/compiler-options.html

๋‚˜๋Š” ๊ณง ๊นจ๋‹ฌ์•˜๋‹ค. ๊ณต๋ฐฑ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€ ์ข‹์€ ์ด์œ ๋Š” ์‹ค์ˆ˜๋กœ .ts ๋Œ€์‹  .js๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ํ•ด์•ผ ํ•  ์ผ์€ .js ํŒŒ์ผ์„ ์ฝ๊ธฐ ์ „์šฉ / ์‹คํ–‰ ์ „์šฉ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, tsc๊ฐ€ .js ํŒŒ์ผ์„ ์ฝ๊ธฐ ์ „์šฉ / ์‹คํ–‰ ์ „์šฉ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก tsc๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์ง€๊ธˆ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋ณด์‹ญ์‹œ์˜ค.

@DanielRosenwasser ์šฐ๋ฆฌ๊ฐ€ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผํ•˜๋Š” ๊ณต๋ฐฑ์„ ๋ณด์กดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹น์‹ ์€ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? LOL์„ ํ•œ ๋‹ฌ ์ด์ƒ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํŠธ๋žœ์Šค ํŒŒ์ผ ๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ๊ธฐ / ์“ฐ๊ธฐ / ์‹คํ–‰ ๊ถŒํ•œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

+1

+1

+1

๊ตฐ์ค‘์€ preserveWhitespace: true/false ์›ํ•ฉ๋‹ˆ๋‹ค
@ORESoftware ++

์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” TypeScript๊ฐ€ JS๋กœ "์ •์ƒ์ ์œผ๋กœ ์ €ํ•˜"๋˜์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ƒˆ ์ค„์„ ๋ณด์กด ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ํŠนํžˆ TypeScript๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ JS๋ฅผ ์ฝ๊ธฐ์— ์•ฝ๊ฐ„ ์กฐ๋ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ JS๋ฅผ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

+1 preserveWhitespace: true/false

์ž„์‹œ ํ•ดํ‚น

esformatter ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

๋‹ค์Œ ๊ตฌ์„ฑ ํŒŒ์ผ ์‚ฌ์šฉ :

{
  "lineBreak": {
    "before": {
      "FunctionDeclaration": ">=2",
      "FunctionDeclarationOpeningBrace": 0,
      "FunctionDeclarationClosingBrace": 1,
      "MethodDefinition": ">=2",
      "ClassDeclaration": ">=2"
    },
    "after": {
      "FunctionDeclaration": ">=2",
      "FunctionDeclarationOpeningBrace": 1,
      "MethodDefinitionClosingBrace": ">=2",
      "ClassClosingBrace": ">=2"
    }
  }
}

@mtraynham ๊ท€ํ•˜์˜ ์˜ˆ :

(<any> x).a('#test')
    .b('test')
    .c(() => 'foo')
    .d(() => 'bar')
    .e(() => 5)
    .f(() => 6);

์ตœ์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋‹ค์Œ JS๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

x.a('#test')
    .b('test')
    .c(function () { return 'foo'; })
    .d(function () { return 'bar'; })
    .e(function () { return 5; })
    .f(function () { return 6; });

(TS PlayGround https://goo.gl/JViurr ์ฐธ์กฐ)

TS ๋ฒ„์ „ 1.1 (์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ TypeScript ๋ฒ„์ „) ์ดํ›„๋กœ ๋งŽ์€ ๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

@ valera-rozuvan ๋Œ€์‹  # 2259๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” ์ค„ ๋ฐ”๊ฟˆ๊ณผ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ์ด ๋ฒ„๊ทธ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. # 2259๋Š” ์ž ์‹œ ๋™์•ˆ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค (2015 ๋…„ 5 ์›”).

์ด๊ฒƒ์€ bril-andrew esformatter ๊ตฌ์„ฑ์ด์ง€๋งŒ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค (ํด๋ž˜์Šค ์„ ์–ธ์— ๋‹จ์–ด import๊ฐ€ ํฌํ•จ ๋œ ๊ฒฝ์šฐ ์ค„ ๋ฐ”๊ฟˆ์ด ์—†์Œ).

{
    "lineBreak": {
        "before": {
            "FunctionDeclaration": ">=2",
            "FunctionDeclarationOpeningBrace": 0,
            "FunctionDeclarationClosingBrace": 1,
            "MethodDefinition": ">=2",
            "ClassDeclaration": ">=2",
            "ExportNamedDeclaration": 2
        },
        "after": {
            "FunctionDeclaration": ">=2",
            "FunctionDeclarationOpeningBrace": 1,
            "MethodDefinitionClosingBrace": ">=2",
            "ClassClosingBrace": ">=2"
        }
    }
}

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

ํ•จ์ˆ˜ ๋‚ด์˜ ๋นˆ ์ค„์€ ํ•จ์ˆ˜์˜ ๊ตฌ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์—†์œผ๋ฉด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

@ahejlsberg ts- ๋˜๋ฉฐ์ด ๋ฌธ์ œ๋Š” js ์ถœ๋ ฅ์—์„œ โ€‹โ€‹๋นˆ ์ค„์ด ์ œ๊ฑฐ๋˜์–ด ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ js์—์ด ์ค„์„ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๋„๋ก ์–ด๋–ป๊ฒŒ ๋„์™€ ๋“œ๋ฆด๊นŒ์š”? :)

์•„๋‹ˆ๋ฉด ์ด๋ฏธ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ณ  ์•„์ง ์ถœ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? -> V4 Next Big ๋ฒ„์ „ # 3143

@JimTheMan ์†Œ์Šค ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ source-map-support ํŒจํ‚ค์ง€ ๊ฐ€ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹์˜ฌ๋ฐ”๋ฅธ ์Šคํƒ ์ถ”์ ์„ ์–ป๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค. diff ํŒจ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ํŒจ์น˜์˜ ๊ณต๋ฐฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ๋ฆผ์œผ๋กœ์จ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. jsdiff๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์กฐํ™” ๋œ ํŒจ์น˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์›ํ•˜๋Š”๋Œ€๋กœ ์กฐ์ž‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import * as diff from 'diff';

const patch =
      diff.parsePatch(diff.createPatch('file', oldText, newText, '', ''));
const hunks = patch[0].hunks;
for (let i = 0; i < hunks.length; ++i) {
  let lineOffset = 0;
  const hunk = hunks[i];
  hunk.lines = hunk.lines.map(line => {
    if (line === '-') {
      lineOffset++;
      return ' ';
    }
    return line;
  });
  hunk.newLines += lineOffset;
  for (let j = i + 1; j < hunks.length; ++j) {
    hunks[j].newStart += lineOffset;
  }
}
return diff.applyPatch(oldText, patch);

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์›๋ณธ ํŒŒ์ผ์˜ ๋ชจ๋“  ์ค„ ๋ฐ”๊ฟˆ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@zeroliu ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ˆˆ์— ๋„๋Š” ์‹œ๊ฐ„ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

@ahejlsberg ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

ํ”„๋กœ์ ํŠธ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ @ valera-rozuvan. 100-1000 LOC์˜ 10 ๊ฐœ ํŒŒ์ผ์„ ํŠธ๋žœ์Šค ํŒŒ์ผํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ๋ˆˆ์— ๋„๋Š” ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ง ํ•ด๊ฒฐ์ฑ…์ด ์—†๋‚˜์š”? ๋‚˜๋„์ด ๊ณค๊ฒฝ์— ์ฒ˜ํ•ด ...

๋‚ด ํŒ€ ๋™๋ฃŒ @emadum ์ด tsc๊ฐ€ ์ฃผ์„์„ ๋ณด์กด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œ์ผœ

const gulp = require('gulp');
const ts = require('gulp-typescript');
const through = require('through2');

function preserveNewlines() {
  return through.obj(function(file, encoding, callback) {
    const data = file.contents.toString('utf8');
    const fixedUp = data.replace(/\n\n/g, '\n/** THIS_IS_A_NEWLINE **/');
    file.contents = Buffer.from(fixedUp, 'utf8');
    callback(null, file);
  });
}

function restoreNewlines() {
  return through.obj(function(file, encoding, callback) {
    const data = file.contents.toString('utf8');
    const fixedUp = data.replace(/\/\*\* THIS_IS_A_NEWLINE \*\*\//g, '\n');
    file.contents = Buffer.from(fixedUp, 'utf8');
    callback(null, file);
  });
}

gulp.task('default', function () {
  return gulp.src('src/**/*.ts')
    .pipe(preserveNewlines())
    .pipe(ts({
      removeComments: false
    }))
    .pipe(restoreNewlines())
    .pipe(gulp.dest('lib'));
});

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

hth

๋ฟก๋ฟก

๋‚˜๋Š” ๊ฒฐ๊ตญ ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒฐ๊ตญ npm ๋ชจ๋“ˆ์ด ๋  ๋•Œ๊นŒ์ง€ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
https://www.npmjs.com/package/gulp-preserve-typescript-whitespace

Readme์— ๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

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