Typescript: ์ „์› TS๋ฅผ ์ดˆ๊ณผํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์˜ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ธฐ๋Šฅ

์— ๋งŒ๋“  2016๋…„ 06์›” 30์ผ  ยท  150์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ts ์˜ค๋ฅ˜ ์œ„์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/// TS_IGNORE
let a:string = 1

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค...
๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ์ž˜ ์•Œ๊ณ  ์žˆ๊ณ  ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ๋ฅผ ์กฐ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜๋Š” ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์ข…๋ฅ˜ : ์•„๋ฌด๊ฑฐ๋‚˜

๋ฌธ์•ˆ ์ธ์‚ฌ

์…˜

Fixed Suggestion

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

๊ทธ๋ƒฅ ์บ์ŠคํŒ… (์บ์ŠคํŒ…์€ ๊ณต์‹ ์šฉ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๊ฐœ๋…)

const foo: string = 7 as any;

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

๋™์˜. Java์˜ @SuppressWarnings ํŠนํžˆ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐˆ๋งํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€:

const typeMetadataKey = Symbol('type');

function type(name: string): PropertyDescriptor {
 return Reflect.metadata(typeMetadataKey, name);
}

Unable to resolve signature of class decorator when called as an expression. ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ:

class Person {
  @type('string')
  firstName: string;
}

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ์œ„์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋ ์ง€์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณด์‹ญ์‹œ์˜ค.

๊ทธ๋ƒฅ ์บ์ŠคํŒ… (์บ์ŠคํŒ…์€ ๊ณต์‹ ์šฉ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๊ฐœ๋…)

const foo: string = 7 as any;

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹จ์ง€ ์˜ˆ๋ฅผ ๋“  ๊ฒƒ์ด์ง€ ์‹ค์ œ๋กœ๋Š” (๋‚˜๋Š” ์บ์ŠคํŒ…์— ๋Œ€ํ•ด ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒ์„ฑ์ž ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„ ์ดํ›„์— super๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค...

  • JS +์—์„œ TS๋กœ ๋” ์‰ฝ๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ˆ˜๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ทธ ์ด์œ  ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋กœ์„œ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค

// tslint:disable ?
tsc ์ˆ˜ํ–‰ํ•˜๋Š” ํŠน์ • ๊ฒ€์‚ฌ๋ฅผ ์ผœ๊ฑฐ๋‚˜ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
_์˜ˆ:_ const FooBar: string = 'rozzzly'; // tslint:disable-line camelcase

๊ทธ๊ฒƒ์€ ๊ต‰์žฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... tsc ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฆฐํ„ฐ์˜ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

"๋‹ฅ์ณ" ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :)

API๊ฐ€ ์•ฝ๊ฐ„ ๋ณ€๋™์„ฑ์ด ์žˆ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ํ•ญ์ƒ ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ "์‹คํ—˜์ " ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜/๊ฒฝ๊ณ ๋ฅผ ์–ต์ œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. tsconfig "experimentalDecorators" ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์˜ (๋งค์šฐ ๊ตฌ์ฒด์ ์ธ) ๋ฒ„์ „์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ฒฝ๊ณ ๋งŒ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค.

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

๊ถ๊ทน์ ์œผ๋กœ, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‚ด Syntastic ์ถœ๋ ฅ์ด ๊นจ๋—ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ _after_ ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;)

"๋‹ซ๊ธฐ"์˜ ๋ฌธ์ œ๋Š” "๊ทธ๊ฒƒ"์—์„œ ๋ฌด์—‡์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. let a:string = 1 a number ๋˜๋Š” string ์ž…๋‹ˆ๊นŒ? a ์˜ ๋‹ค๋ฅธ ์„ ์–ธ์ด ์žˆ์œผ๋ฉด ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๊นŒ? return {a} ; ์™€ ๊ฐ™์ด ์ด ๋ณ€์ˆ˜์˜ ์œ ํ˜•์„ ์บก์ฒ˜ํ•œ ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด { a : number } ๋˜๋Š” { a: string } ๋˜๋Š” ๋‘˜ ๋‹ค์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์€ ์˜ค๋ฅ˜๋Š” ๋ชจ๋‘ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ์ถœ๋ ฅ ์ƒ์„ฑ์ด๋‚˜ ๋„๊ตฌ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: any , ์œ ํ˜• ์ฃผ์žฅ(์บ์ŠคํŠธ) ๋ฐ ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ).

์˜ˆ๋ฅผ ๋“ค์–ด "์œ ํšจํ•˜์ง€ ์•Š์€" ์ •์˜๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  declare module "blah" { export = any } ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” declare var $: any ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ท€ํ•˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฌํ•œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TS 2.0์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ "๋‹ฅ์ณ", ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์˜ ์žฅ์  (๋˜๋Š” ์‹ค์ œ๋กœ ๋ถ€์กฑํ•จ)์€ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

let x: PieInTheSky = <any> 'cake is a lie';

์ข‹์•„, ํ•˜์ง€๋งŒ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋ฌธ์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์บ์ŠคํŒ…์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

<any> ๋Š” TypeScript์˜ ๋ชจ๋“  ์„ฑ๊ฐ€์‹  ๊ฒƒ๋“ค๋กœ๋ถ€ํ„ฐ 100% ์ž์œ ๋กœ์ด ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฌด์—‡์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์ด ์•„๋‹Œ super๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์กฐ์šฉํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํŒจํ„ด์„ ๋ฐ›์•„๋“ค์ด๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด ๋ณด์‹ญ์‹œ์˜ค.

_ ClassA.ts _

class A {
    constructor() {
        this.init();
    }
    protected init() {
        // does nothing by itself
    }
}

_ ClassB.ts _

class B extends A {
    constructor() {
        super();
        console.log('rest of code from B\'s constructor');
    }
    protected init() {
        console.log('this runs before the rest of code from B\'s constructor');
    }
}

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

์ œ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์ด ์•„๋‹Œ super๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์กฐ์šฉํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋ฅผ ES6๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ์„ธ์š”... ์ด๊ฒƒ์ด ๋ฐ”๋กœ TypeScript์˜ ์ฃผ์š” ๋ชฉ์ ์ด ๐Ÿ‘ฃ :gun: ์„ ์†์—์„œ ๋นผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์‹ถ์€ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

class Dog implements Animal {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

์ง€๊ธˆ ts์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

[ts] 'Dog' ํด๋ž˜์Šค๊ฐ€ 'Animal' ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž˜๋ชป ๊ตฌํ˜„ํ•จ
'๊ฐœ' ์œ ํ˜•์— 'numberOfLegs' ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์™„์ „ํžˆ ์ž˜๋ชป๋˜์—ˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ชจ๋“  ์†์„ฑ์„ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@DethAriel ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์‚ฌํ›„ ์กฐ๊ฑด ๋ถ€์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ธด ํ•˜์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

@aluanhaddad ๋„ค , ์™„์ „ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ์›์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ด์— ๋Œ€ํ•œ ์ถ”ํ•˜์ง€ ์•Š์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ตœ์†Œํ•œ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค์ด๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ๋•Œ ์šฐ๋ฆฌ๋ฅผ ์‹ ๋ขฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค + ํด๋ž˜์Šค ์ฝค๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

interface Animal {
  numberOfLegs: number;
  // a gazillion more properties
}

interface Dog extends Animal {
}

class Dog  {
  breed: string;

  constructor(animal: Animal, breed: string) {
    Object.assign(this, animal);
    this.breed = breed;
  }
}

Thx, @mhegazy , ์‹ค์ œ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ <any> ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

https://github.com/Microsoft/TypeScript/issues/3508 ์—์„œ ๋…ผ์˜๋œ ์‹คํ—˜์  ๋ฐ”์ธ๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ :: ์•ž์— ์žˆ๋Š” ๊ฐ ์ค„์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. TS1128: Declaration or statement expected )

์‹คํ—˜์  ๋ฐ”์ธ๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ˜„์žฌ ๊ฑฐ๋Œ€ํ•œ JS ํ”„๋กœ์ ํŠธ๋ฅผ typescript๋กœ ๋ณ€ํ™˜ ์ค‘์ด๋ฉฐ gulp build ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ์•ฝ 2000๊ฐœ์˜ TS ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๋ชจ๋“ˆ์— ์ •์˜๋˜์ง€ ์•Š์€ ์†์„ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ์ •๋œ. ์ถœ๋ ฅ JS ํŒŒ์ผ์ด ์ƒ์„ฑ๋  ๋•Œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ •ํ™•ํžˆ ์ œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ES6 ์ด์ „ ๋ชจ๋“ˆ์„ ์†์„ฑ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋นŒ๋“œํ•œ ์•ฑ์„ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ ๊ฑฐ๋Œ€ํ•œ app.namespace1.namespace2.something.views.view์™€ ๊ฐ™์€ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์ „์—ญ app.* ๊ฐœ์ฒด์™€ ๋‚ด ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ํ•˜์œ„ ์š”์†Œ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ๊ฒƒ์€ "๋„ค์ž„์ŠคํŽ˜์ด์Šค '์•ฑ'์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ' ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ชจ๋“  ์ „์—ญ ์ข…์†์„ฑ์„ globalProxy.ts๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๋Š” ์œ ์ผํ•œ ์žฅ์†Œ์ด์ง€๋งŒ ์ฝ˜์†”์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด ํŒŒ์ผ์˜ ๋งจ ์œ„์— //TS-NO-WARNINGS๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ ๋ฉ”์‹œ์ง€์—์„œ ...

TS ์˜ค๋ฅ˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด์‹œํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ์˜ ์ •ํ™•์„ฑ์„ ์ฃผ์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@zeeshanjan82 --allowJs ํ•˜๊ณ  ํŒŒ์ผ๋ณ„๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ์†Œ์Šค์—์„œ ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ฐ๋น„์–ธํŠธ ์™€์ผ๋“œ์นด๋“œ ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋“ˆ ํ™•์ธ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
_globals.d.ts_

declare module '*';

๋‹ค์Œ์€ ์˜ค๋ฅ˜ ์–ต์ œ๋ฅผ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ˆœ๊ฐ„์˜ ๋ฒ„์ „์„ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ TS throwing ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ณธ์งˆ์ ์œผ๋กœ isoWeek ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ์€ ๋ฐ”์œ„์™€ ํž˜๋“  ๊ณณ ์‚ฌ์ด์— ๋ผ์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๋งํ•˜์‹ญ์‹œ์˜ค.

// ./overrides/moment.d.ts
declare module "moment";
// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "baseUrl": ".",
        "paths": {
            "moment": ["overrides/moment.d.ts"]  // override definition for moment
        }
    }
}

์ด์ œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ณต์‚ฌ๋ณธ ๋Œ€์‹  override/moment.d.ts ์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ˆœ๊ฐ„ ์„ ์–ธ ํŒŒ์ผ์˜ ๋กœ์ปฌ ๋ณต์‚ฌ๋ณธ์ด๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ์ž‘์€ ์ง‘ํ•ฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋‚˜๋งŒ์˜ ํƒ€์ดํ•‘ ์ •์˜๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” ์‹œ๊ฐ„๊ณผ ์š•๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ;)

์ œ3์ž ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋‚˜๋งŒ์˜ ํƒ€์ดํ•‘ ์ •์˜๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” ์‹œ๊ฐ„๊ณผ ์š•๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ;)

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์— ๋Œ€ํ•ด declare var $: any ์— ํ•ด๋‹นํ•˜๋Š” declare module "moment"; ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ

@mhegazy ์˜ ์ œ์•ˆ์€ ์•„์ฃผ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐ ์•ฝ 20์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ˆœ๊ฐ„๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ทธ๋“ค์€ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ์žฅ์น˜๋ฅผ ์žŠ์–ด ๋ฒ„๋ ธ๊ณ  ๋‚ด ํ’€ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐ ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์˜ ๋‹จ์  declare module "moment"; ๋” ์ด์ƒ ์–ด๋Š ์ˆœ๊ฐ„ ๊ด€๋ จ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  IDE ์ธํ…”๋ฆฌ ๋˜๋Š” ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์ƒํ•˜๋Š” any ๋Š” ์ฃผ๋ณ€ ์ฝ”๋“œ๋กœ ํ˜๋Ÿฌ๋“ค์–ด๊ฐ€ ๋งŽ์€ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๊ฑฐ์šด ๋Œ€๊ฐ€์ž…๋‹ˆ๋‹ค.

@aluanhaddad ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ด๋ฆฐ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์œ„ํ•ด isoWeek ๋Œ€ํ•œ ์ง€์›์€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๊ทธ๊ณณ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .

์š”์ ์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ Angular 2 ๋“ฑ์˜ ์ฑ„ํƒ๊ณผ ํ•จ๊ป˜ ์•ž์œผ๋กœ ๋” ์ž์ฃผ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ฏ€๋กœ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚ด๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(net, node 6.9 LTS)์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

server = net.createServer({ pauseOnConnect: true }, function(connection) { ... }) 
// [ts] severity: 'Error'
message: 'Argument of type '{ pauseOnConnect: boolean; }' is not assignable to parameter of type '{ allowHalfOpen?: boolean; }'.
  Object literal may only specify known properties, and 'pauseOnConnect' does not exist in type '{ allowHalfOpen?: boolean; }'.'

๋˜ํ•œ ioredis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜:

var redis = new Redis(CONFIG.redis); 
// [ts] severity: 'Error'
message: 'Only a void function can be called with the 'new' keyword.'

@yortus ์™€ @adamreisnz๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ์ •์˜ ํŒŒ์ผ์ด ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ declare module "x"; ์‚ฌ์šฉํ•˜์—ฌ TS ํ˜œํƒ์„ ํฌ์ƒํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์• ์ดˆ์— TS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ง€๋Šฅ์„ ์žƒ์ง€ ์•Š๋„๋ก ๋ˆ„๋ฝ๋œ ์œ ํ˜•์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ณด๊ฐ•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด๊ฐ€ ์“ธ ๋•Œ :

if (typeof Symbol === "function" && Symbol.match) {
  // ...
}

typescript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” target ๊ฐ€ es5 ์ด๋ฉด ํ•ญ์ƒ ์˜ค๋ฅ˜ Cannot find name 'Symbol' ๋ณด๊ณ ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฃผ์„ ์ค„์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ถ€ ์ œ์–ด ์ง€์‹œ๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

declare var Symbol: any;

@gdh1995 @mhegazy ๋˜๋Š” lib ํ”Œ๋ž˜๊ทธ๋ฅผ es2015 ๋กœ ์„ค์ •ํ•˜๋Š” ์‹ค์ œ ์ˆ˜์ •์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@mhegazy ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

declare var Symbol: {
  (description?: anyNotSymbol): symbol;
  readonly match: symbol;
};

@DanielRosenwasser es2015 ๊ฐ€ ์ด๋Ÿฌํ•œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” es5 ์™€ ํ˜ธํ™˜๋˜๋„๋ก ์ œํ•œ๋˜๋ฉฐ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” Symbol ๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง€๊ธˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ typeof Symbol === "function" ์ž‘์„ฑํ–ˆ์„ ๋•Œ์—๋„ ๋‚˜์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ถฉ๊ณ ?

๋‚ด๊ฐ€ ๊ธฐ๋Šฅํ•˜๊ณ  ์‹ถ์€ ํ•œ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ์ข…์†์„ฑ์„ ์กฐ๋กฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// Test.ts

// Component to test
import {ComponentToTest} from './ComponentToTest';

// Dependency of ComponentToTest to mock
import {Dependency} from './Dependency';

// Mock to replace it with
import {MockedDependency} from './MockedDependency';

Dependency = MockedDependency;

์ด ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ ์ข…์†์„ฑ์„ ์กฐ๋กฑํ•˜๋Š” ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ–์ง€๋งŒ TypeScript๋Š” "๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— '์ข…์†์„ฑ'์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜.

๋‚˜๋Š” ์‘๋‹ต์ด ์ž˜๋ชป๋œ ๋‚˜๋ฌด๋ฅผ ์ง–๊ณ  ์žˆ๊ณ  inject-loader ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค

์ด ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ ์ข…์†์„ฑ์„ ์กฐ๋กฑํ•˜๋Š” ์›ํ•˜๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ–์ง€๋งŒ TypeScript๋Š” "๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— '์ข…์†์„ฑ'์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜.

์ด๊ฒƒ์€ ES6์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—”์ง„์ด ES6 ๋ชจ๋“ˆ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•  ๋•Œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ComponentToTest ๊ฐ€ Dependency ๋Œ€ํ•œ ์ธ์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก ํ•˜๊ณ  ํ…Œ์ŠคํŠธ์—์„œ ์ด๋ฅผ ํ†ต๊ณผํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— Dependency ๊ฐ’์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ํ›„ํฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ComponentToTest .

์ด๊ฒƒ์€ ES6์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—”์ง„์ด ES6 ๋ชจ๋“ˆ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•  ๋•Œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„, ๊ทธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ComponentToTest๊ฐ€ Dependency์— ๋Œ€ํ•œ ์ธ์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๋Š” ์ด๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์˜ API๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ์ ˆ๋ฆ„๋ฐœ์ด์ด์ง€๋งŒ TS๋งŒ์˜ ๋ฌธ์ œ๋Š” ์ „ํ˜€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @mhegazy

ํ•จ์ˆ˜์˜ ์ธ์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

function isValidId(s: string): boolean {}

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

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

๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ์—์„œ ์ž˜๋ชป๋œ ํ˜•์‹์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@rpadovani ๋Š” any .

expect(isValidId(78 as any)).toBe(false);

๋‚˜๋„ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. foo(bar: any, baz: any)๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€๋กœ ์ •์˜๋˜์ง€๋งŒ foo์˜ ์ผ๋ถ€ ๊ตฌํ˜„์—์„œ๋Š” bar๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. typescript ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์ผœ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. foo, bar์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@benjaminabbitt foo (_bar: any, baz: any) ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค: "_" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„์€ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€: ํŠน์ˆ˜ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œ/๋ฌด์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์–ด๋ ค์šด ์ ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ณ , ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ๊ฒŒ์‹œํ•˜๊ณ , ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•œ ํšจ๊ณผ์ ์ธ ์ฝ”๋“œ ๋‚ด ์†”๋ฃจ์…˜์„ ์–ป๊ณ  ์‹ถ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์ฝ”๋“œ์— ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‚ด๋ฉด). ์ง„์ •์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์–ต์ œํ•˜๋ ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— ํฌํ•จํ•˜๋ ค๋Š” ํƒ€์‚ฌ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. npm์— ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ๊ฑฐ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ณต๊ฐœ๋œ ๊ฒฝ์šฐ์—๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งŽ์€ ๋ฐ๋“œ ์ฝ”๋“œ๋ฅผ ์šด๋ฐ˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ์ฒด์— ์ฒจ๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์ด ๊ฒฝ์šฐ ์ด ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ถ”์ถœํ•˜๊ณ  npm์— ๊ฒŒ์‹œํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ด ์ƒํ™ฉ์—์„œ๋Š” ๋งจ ์œ„์— /* ts:disable */ ์ฃผ์„์„ ๋‹ฌ์•„์„œ typescript๊ฐ€ ํŒŒ์ผ ๋‚ด ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”„๋กœ์ ํŠธ๋Š” ๋” ์ด์ƒ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ํ๋ฆ„์— ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜์šฉํ•˜๋ ค๊ณ ํ•˜๋ฉด ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

typescript ํ”„๋กœ์ ํŠธ์—์„œ ํ˜ธ์ŠคํŒ…ํ•ด์•ผ ํ•˜๋Š” ํƒ€์‚ฌ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์กฐ์–ธ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

typescript ํ”„๋กœ์ ํŠธ์—์„œ ํ˜ธ์ŠคํŒ…ํ•ด์•ผ ํ•˜๋Š” ํƒ€์‚ฌ JavaScript ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์กฐ์–ธ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. .js ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋Œ€์‹  .d.ts ํŒŒ์ผ์„ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ .d.ts ํŒŒ์ผ์ด ์–ด๋–ค ์˜๋ฏธ์ธ์ง€์ž…๋‹ˆ๋‹ค.

.d.ts ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

declare var $: any;

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•„์š”์— ๋”ฐ๋ผ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

js ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒฝ์šฐ ์ข‹์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. js ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

js ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒฝ์šฐ ์ข‹์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. js ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. JS ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ์ถ”๊ฐ€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๊ท€ํ•˜์˜ ๊ฒƒ์ด ์•„๋‹Œ ์™ธ๋ถ€ ์ฝ”๋“œ ๋˜๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ TS๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .d.ts ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์—ฌ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ฅผ ์œ„ํ•ด any ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๊ณ„์† ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

js ํŒŒ์ผ์ด git ์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฏ€๋กœ ts ํŒŒ์ผ์— ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋ง์”€ํ•˜์‹  ๊ฒฝ๋กœ๋กœ ๊ฐ€์„œ js ํŒŒ์ผ์„ ๊ฐ•์ œ๋กœ ์ปค๋ฐ‹ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

.js ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ say react๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ €์žฅ์†Œ์— react-0.12.0.js ๋ฅผ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด CDN์˜ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์— ์ด๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. @types/react ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ์ ํŠธ์— declarations.d.ts ๋ผ๋Š” ์ƒˆ ์„ ์–ธ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

declare module "react"; // just saying the module is of type any

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์— "react"๋ผ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์œผ๋ฉฐ .js ํŒŒ์ผ์„ ํฌํ•จํ•  ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ž‘์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ์–ด๋ฆฌ(npm/CDN์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ์ปค๋ฐ‹ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ 2๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ 1 : ์›๋ณธ ์ฝ”๋“œ๋ฅผ .js ํŒŒ์ผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด .d.ts ํŒŒ์ผ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@jmlopez-rod๋Š” ์ž์‹ ์˜ repo์— ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋”๋ผ๋„ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ต์…˜ 2 : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ์‹ธ๊ณ  ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

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

@jmlopez-rod๋Š” ์ž์‹ ์˜ repo์— ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋”๋ผ๋„ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ์ด์œ ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "library.js" ๋ฐ "website.js" ์žˆ๊ณ  "website.js"๋ฅผ "website.ts"๋กœ ์ด๋™ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  tsc website.ts --outFile website.js ํ˜ธ์ถœํ•˜๋ฉด ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์žˆ๋Š” ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ .js ํŒŒ์ผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฒด์ธ์˜ ๋จธ๋ฆฌ ๋ถ€๋ถ„์—์„œ ์ถ”๊ฐ€ ๋นŒ๋“œ ๋‹จ๊ณ„์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

์ด ํŒŒ์ผ์„ ts๋กœ ์ „ํ™˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์™€ ํ†ตํ•ฉํ•˜๊ณ  ์ด ํŒŒ์ผ์˜ ํ˜•์‹์ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ๋ฅด๊ฒŒ ํ•˜๊ณ  ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋นŒ๋“œํ•˜๋ฉด์„œ๋„ ๋‹ค๋ฅธ ํ‘œ์ค€์„ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์•ฐ๋น„์–ธํŠธ ์„ ์–ธ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์ด tsconfig.json์— ๋Œ€ํ•œ ๊ฒฝ๋กœ ์ •์˜๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
"paths": { "js-xlsx": ["./xlsx.d.ts"] }
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
'fs', 'fs-extra'๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ 'js-xlsx' ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ๋‚ด ์ฃผ๋ณ€ ์„ ์–ธ, ์บ์ŠคํŒ… ๋˜๋Š” ์—ฌ๊ธฐ์— ๋ชจ๋“  ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‘๋‹ตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. declare var $: any;
@mhegazy

.js ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ say react๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ repo์—์„œ react-0.12.0.js๋ฅผ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด CDN์˜ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์— ์ด๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. @types/react๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ์— ์ƒˆ๋กœ์šด ์„ ์–ธ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์„ ์–ธ๋ฌธ.d.ts๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค:

๋ชจ๋“ˆ "๋ฐ˜์‘" ์„ ์–ธ; // ๋ชจ๋“ˆ์ด any ์œ ํ˜•์ด๋ผ๊ณ  ๋งํ•จ
์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์— "react"๋ผ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์œผ๋ฉฐ .js ํŒŒ์ผ์„ ํฌํ•จํ•  ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  fs-extra ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” @types/fs-extra์™€ ๊ฐ™์€ ์œ ํ˜• ์ •์˜๊ฐ€ ์žˆ๊ณ  js-xlsx์—๋Š” ts-xlsx ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ์ด์ƒํ•ด์„œ ์ด ํŠธ๋ฆญ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  fs-extra ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” @types/fs-extra์™€ ๊ฐ™์€ ์œ ํ˜• ์ •์˜๊ฐ€ ์žˆ๊ณ  js-xlsx์—๋Š” ts-xlsx ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ์ด์ƒํ•ด์„œ ์ด ํŠธ๋ฆญ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ๋‹ค๋ฅธ ๋ญ”๊ฐ€๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

c:\test\9448>npm install @types/fs-extra
[email protected] c:\test\9448
`-- @types/[email protected]
  `-- @types/[email protected]

npm WARN [email protected] No description
npm WARN [email protected] No repository field.

c:\test\9448>type a.ts
import { rmdir } from "fs-extra";
rmdir("c:/test");

c:\test\9448>type tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5"
    }
}
c:\test\9448>tsc --v
Version 2.2.0

c:\test\9448>tsc

c:\test\9448>echo %ERRORLEVEL%
0

๋„ค ์•„๋งˆ๋„ ํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ๋‚˜๋Š” https://github.com/AngularClass/angular2-webpack-starter , ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ฐ˜์ด

์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์•ˆํ‹ฐ ํŒจํ„ด์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

error TS1005: '{' expected.

์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹์€ JSX์—์„œ:

<motor-node ref      = 'menu'
    absoluteSize     = `0, ${this.MENU_BAR_HEIGHT}, 0`
    >
    {menu}
</motor-node>,

ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์ด { ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์œผ๋กœ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ๊ทธ๋•Œ๊นŒ์ง€๋Š” ์ •๋‹นํ•œ ์ด์œ ๋กœ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜

@trusktr , ์ด ์˜ค๋ฅ˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ต์ œํ•ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ์‹œ์ ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํŒŒ์ผ์˜ ๋ชจ์–‘์ด ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์— ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์‹œ๋˜๋”๋ผ๋„ ์ด ํŒŒ์ผ์ด๋‚˜ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ถ”๋œ ์œ ํ˜•๋„ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ๋‹ค. JSX ์‚ฌ์–‘ ์— ๋”ฐ๋ฅด๋ฉด:

JSX์†์„ฑ๊ฐ’:

" JSXDoubleStringCharactersopt "
' JSXSingleStringCharactersopt '
{ ํ• ๋‹น์‹ }
JSX์š”์†Œ

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ •ํ™•ํ•˜๊ณ  JSX ์†์„ฑ์ด ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  absolteSize = {...} ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค

๋„ค, ๊ทธ๋ž˜์„œ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ์€ absoluteSize: "0, " + this.MENU_BAR_HEIGHT + ", 0" ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์˜ค. ๋ฏธ์•ˆํ•˜์ง€๋งŒ. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์˜ค๋ฅ˜๋ฅผ ์นจ๋ฌต์‹œํ‚ค๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ทธ๋žฌ์ง€๋งŒ ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ {} ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TS 2.1(VS2017 RC)์—์„œ๋Š” TS7027๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ JS ํŒŒ์ผ(/Scripts์— ์žˆ์Œ) ํด๋”์—์„œ ์˜ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์—์„œ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ผ์ข…์˜ ์ „์—ญ ์–ต์ œ โ€‹โ€‹ํŒŒ์ผ(C# GlobalSupressions.cs์™€ ์œ ์‚ฌ)์—์„œ ์ด๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TS 2.1(VS2017 RC)์—์„œ๋Š” TS7027๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ JS ํŒŒ์ผ(/Scripts์— ์žˆ์Œ) ํด๋”์—์„œ ์˜ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ(TS 7027)์˜ ๊ฒฝ์šฐ --allowUnreachableCode ์„ค์ •ํ•˜๊ฑฐ๋‚˜ tsconfig.json .

๊ทธ๋Ÿฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™œ๋ƒํ•˜๋ฉด "๋‚ด ์ฝ”๋“œ"๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!

--alowJs ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๊ฒƒ์„ ๋นจ์•„๋“ค์—ฌ ์ œ์•ˆ๋œ ๋Œ€์ƒ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  --outFile ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค .. ๋‹จ์ง€ .js ํ™•์žฅ์ž๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ์ฝ”๋“œ์ธ ๊ฒฝ์šฐ .d.ts๋ฅผ ๋งŒ๋“ค๊ณ  ๋Œ€์‹  ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ --allowJs๋ฅผ ์ผฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. VS2015์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ์— ์žˆ๋Š” jquery.js, react.js ํŒŒ์ผ์„ ๊ตฌ๋ถˆ๊ตฌ๋ถˆํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์‚ฌ์‹ค html ํŽ˜์ด์ง€์—์„œ๋งŒ ์ฐธ์กฐ๋จ

let { value } = browser.waitForPromise(() => {
    return browser.executeAsync(function (method, name, resolve) {
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {
            resolve(result);
        });
    }, method, name);
});

์ œ ๊ฒฝ์šฐ์—๋Š” TypeScript๋กœ ์ž‘์„ฑ๋œ ์ฒซ ๋ฒˆ์งธ ์ค„, JavaScript๋กœ ์ž‘์„ฑ๋œ ๋‘ ๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋ฉฐ JavaScript ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ /* ts-disable */ /* ts-enable */ (eslint์™€ ์œ ์‚ฌํ•œ)์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” TypeScript๋กœ ์ž‘์„ฑ๋œ ์ฒซ ๋ฒˆ์งธ ์ค„, JavaScript๋กœ ์ž‘์„ฑ๋œ ๋‘ ๋ฒˆ์งธ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋ฉฐ JavaScript ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"JavaScript๋กœ ์ž‘์„ฑ๋œ ๋‘ ๋ฒˆ์งธ ์ค„"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์…จ์Šต๋‹ˆ๊นŒ? ์ „์ฒด ๋ช…๋ น๋ฌธ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ?

"JavaScript๋กœ ์ž‘์„ฑ๋œ ๋‘ ๋ฒˆ์งธ ์ค„"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์…จ์Šต๋‹ˆ๊นŒ? ์ „์ฒด ๋ช…๋ น๋ฌธ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์…€๋ ˆ๋Š„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ทธ๋Œ€๋กœ .

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ Selenium ์„œ๋ฒ„์— ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด .ts ํŒŒ์ผ์— ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ์œ ํ˜• ์ฃผ์„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค..

์–ด์จŒ๋“  ์ด ์ƒ˜ํ”Œ์˜ ๊ฒฝ์šฐ declare var browser: any; ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์€ ๋†€์ดํ„ฐ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด๊ฒƒ์ด .ts ํŒŒ์ผ์— ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ์œ ํ˜• ์ฃผ์„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค..

์ฃผ์–ด์ง„ ์ฝ”๋“œ๊ฐ€ IE6 ๋ฐ ๊ธฐํƒ€ ์ด์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๋ณด์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Node.js๋Š” CommonJS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๋”ฐ๋ฅด์ง€๋งŒ ๋‚ด require ๋Š” ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌํ›„ ๋ฐ ์‚ฌ์ „ ์ˆ˜์ • ์—†์ด ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜์™€ ๋‚ด ํŒ€์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ์ƒ˜ํ”Œ์—์„œ๋Š” var browser: any๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ์€ ๋†€์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์‹ค ๋ธŒ๋ผ์šฐ์ € ๊ฐœ์ฒด๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ฐœ์ฒด์ด๋ฉฐ ๋ฌด์‹œํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. browser.execute ๋ฉ”์„œ๋“œ์—๋Š” ์ž์ฒด ํ˜•์‹ ์„ ์–ธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์–ป๋Š” ์˜ค๋ฅ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ์ฝ”๋“œ๋Š” ๋…ธ๋“œ์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ปจํ…์ŠคํŠธ์˜ ํ˜„์žฌ ๋ฌธ์ œ๋Š” ์œ ํ˜• ์ฃผ์„ ๋ฐ ์ฝ”๋“œ ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

img-2017-03-07-02-10-28

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
            function (method, name, resolve) { // browser
        require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
            resolve(result);  // browser
        });  // browser
    }, method, name); 
});

๋‹ค์Œ์€ browser.executeAsync ๋ฉ”์„œ๋“œ์˜ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

browser.executeAsync  = (...args) => {
   let script = args.shift();

   RPC.Selenium('/session/:sessionId/execute', {
         script: `return (${script}).apply(null, arguments)`, 
         args
    });
}

๋ณด์‹œ๋‹ค์‹œํ”ผ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์— TypeScript๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ‘œ์ค€ ์˜ค๋ฅ˜:

TS2345: Argument of type 'string[]' is not assignable to parameter string
TS7006: Parameter 'error' implicitly has an 'any' type
TS7006: Parameter 'attach' implicitly has an 'any' type
TS7006: Parameter 'message' implicitly has an 'any' type
TS7006: Parameter 'model' implicitly has an 'any' type

๋“ฑ๋“ฑ...

require ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

declare function require(v: string[]): any;

require๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

๋‚œ ํ•  ์ˆ˜ ์—†์–ด. ์ œ ๊ฒฝ์šฐ์—๋Š” executeAsync ๋ฉ”์„œ๋“œ์— ํƒ€์‚ฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ require ์—๋Š” ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
๋‚ด ์š•๋ง์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :)

declare function require(v: string[]): any; ๋กœ์ปฌ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

// module a.ts
export var ...

declare function require(v: string[], callback: Function);

let { value } = browser.waitForPromise(() => { 
    return browser.executeAsync( 
        function (method, name, resolve) { // browser
            require(['patron.Locator/patron.Locator.Manager'], function (locator) {  // OK
                resolve(result);  
            });  
        }, method, name);
});

ํ•„์š”ํ•  ๋•Œ any ์บ์ŠคํŒ…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

let { value } = browser.waitForPromise(() => { // node
    return browser.executeAsync( // node
        function (method, name, resolve) { // browser
            (<any>require)(['patron.Locator/patron.Locator.Manager'], function (locator) {  // browser
                resolve(result);  // browser
            });  // browser
        }, method, name);
});

์ด๊ฒƒ์€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค์— ์˜ํ•ด์„œ๋งŒ ํ™•์žฅ๋˜๋Š” ๋น„๊ณต๊ฐœ(๋‚ด๋ณด๋‚ด์ง€ ์•Š์€) ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

abstract class IParent {
  static fromConfig(config: ParentConfig): IParent {
    // actual code is 20 lines long, not this simple
    // this throws "Cannot create an instance of the abstract class 'Parent'"
    return new this().applyConfiguration(config);
ย  }
  abstract method1(): void;
  ...
}

export class FirstChild extends IParent {
  specificMethodForFirstChild() {ย ... }
  method1() { ... }
  ...
}

export class SecondChild extends IParent {
  specificMethodForSecondChild();
  method1() { ... }
  ...
}

์šฉ๋ฒ•:

let first = FirstChild.fromConfig({ ... });
let second = SecondChild.fromConfig({ ... });

// this runs successfully:
(first as FirstChild).specificMethodForFirstChild();
(second as SecondChild).specificMethodForSecondChild();

ํ•˜์ง€๋งŒ fromConfig() ๋ฉ”์„œ๋“œ์—์„œ "Cannot create an instance of the abstract class 'Parent':

ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ฝ”๋“œ

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

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

์ด๊ฒƒ์ด ๋งž๋‹ค๋ฉด new (<any>this)(x, y); ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ข‹์€ ์  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์‹ค์ œ๋กœ ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ—˜์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Module ... was resolved to ..., but '--allowJs' is not set ์†Œ๋ฆฌ๋ฅผ ์—†์• ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉฐ TSC๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

'๋ชจ๋“ˆ "someModule" ์„ ์–ธ;' .d.ts ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜์—์„œ.

๋˜๋Š” ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ผ์น˜ํ•˜๋Š” @types ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ์œ ์šฉํ•  ๋•Œ์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

const Button = (
  content: contentTypes,
  action: React.EventHandler<React.MouseEvent<HTMLDivElement>>,
  disabled: boolean
): JSX.Element => (
  <div className={`Button disabled-${disabled}`} onTouchStart='' onClick={ !disabled ? action : undefined } >
    { content }
    <div className='background'></div>
  </div>
);

onTouchStart๊ฐ€ true์ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฌธ์ž์—ด์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ onTouchStart='' ๋Š” ํŠน์ • CSS ๊ทœ์น™๊ณผ ๊ด€๋ จ๋œ ํ„ฐ์น˜ ์žฅ์น˜์—์„œ ๊นจ์ง„ CSS ๋™์ž‘์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ JSX ์œ ํ˜•์„ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ค„์—์„œ ์‹ถ์Šต๋‹ˆ๋‹ค.

onTouchStart={<any>''}

๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
error
tsx ๊ตฌ๋ฌธ์—์„œ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค.

onTouchStart={'' as any} , ์˜คํžˆ๋ ค (JSX๊ฐ€ ๋Œ€์ฒด ์–ด์„ค์…˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค)

@RyanCavanaugh ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์ด ๊ธฐ๋Šฅ์˜ ์ ๋ฒ•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•ด๋‹นํ•ฉ๋‹ˆ๊นŒ? ๋…ธ๋“œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ API ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด swagger codegen ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ์˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” swagger ์ •์˜๋ฅผ TypeScript ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ž์‹ ์˜ swagger ๊ณ„์•ฝ์„ ์กด์ค‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์•ฝ๊ฐ„ ์ด์ƒํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ธ”๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

let contentTypeHeader: Dictionary<string>;
if (contentTypeHeader) {
    fetchOptions.headers = contentTypeHeader;
}

strictNullChecks ๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ „์ฒด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋•๋‹ˆ๋‹ค. ์งœ์ฆ๋‚œ๋‹ค. ์ƒ์„ฑ๋œ typescript๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ <tsc strictNullChecks=false /> ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํŒŒ์ผ ๋งจ ์œ„์— ์‚ฝ์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค( @alexanderbird ์˜ ์ œ์•ˆ ๊ณผ ์œ ์‚ฌ).

์ด๊ฒƒ์€ strictNullChecks ํ˜ธํ™˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ swagger ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์š”์ฒญ์ด ์•„๋‹Œ๊ฐ€์š”?

@mhegazy ํ™•์‹คํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์˜ ํ•œ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. TypeScript์—์„œ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(JavaScript๋ณด๋‹ค ๋” ์œ ์šฉํ•จ). ๋”ฐ๋ผ์„œ ์ด์ƒ์ ์œผ๋กœ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์˜ ํ‘œ์ค€์œผ๋กœ ๋Œ์–ด๋‚ด๋ฆฌ๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ :) ์ž๋™ ์ƒ์„ฑ ๋„๊ตฌ์—์„œ ์–ป์€ ์ฝ”๋“œ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋กœ ํ˜๋Ÿฌ ๋“ค์–ด๊ฐ€๋Š” ์œ ํ˜•์ด ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ๊ฐ€ --strictNullChecks ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์—†๋Š” ์œ ํ˜•์„ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ˆ˜ํ‘œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ํ™”์žฌ ๊ฒฝ๋ณด๊ธฐ๋ฅผ ๋„๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ฒฝ๋ณด๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์• ์ดˆ์— ํ™”์žฌ์˜ ์›์ธ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mhegazy ๋งค์šฐ ์ž˜ ํ…Œ์ŠคํŠธ๋œ ๋„๊ตฌ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ์—์„œ ํ™”์žฌ ๊ฒฝ๋ณด๋ฅผ

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

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

์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋™๋ฐ˜์ž .d.ts์™€ ํ•จ๊ป˜ .js์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

typescript ์ปดํŒŒ์ผ๋Ÿฌ๋Š” chain๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” underscore.js ๋ฏน์Šค์ธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

_.mixin(){sortFunciton: sortFunc(), otherChainFunc: otherFunction()}

....

someVal = _.chain(someArray)
.sortFunction()
.otherChainFunc()
.๊ฐ’();

...

์•„์ฃผ ์‰ฌ์šด ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Angular์˜ ๊ฒฝ์šฐ @HostListener() ์™€ ๊ฐ™์ด ํด๋ฆญ์— ๋Œ€ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@HostListener('click', ['$event'])
onClick(event: MouseEvent) {
    // Code here...
}

noUnusedLocals ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ERROR in ./src (20,13): 'onClick' is declared but never used.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@JeremyCarlsten

_.mixin(){sortFunciton: sortFunc(), otherChainFunc: otherFunction()}

์ž˜๋ชป๋œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@leocaseiro ์™œ ๋น„๊ณต๊ฐœ์—ฌ์•ผ ํ•˜๋‚˜์š”? ์ด ๊ฒฝ์šฐ onClick ๋Š” angular๊ฐ€ ๊ฒฐ๊ตญ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ์ธ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ญ์ƒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋ฅผ ๊ณต๊ฐœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Angular๊ฐ€ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @jmlopez-rod, ๋งž์Šต๋‹ˆ๋‹ค.

๊ณต๊ฐœ์ ์œผ๋กœ ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ง€๊ธˆ์€ ์ง€๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๋„์›€์„ ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@leocaseiro public์€ ๊ธฐ๋ณธ ๊ฐ€์‹œ์„ฑ ์ˆ˜์ค€์ด๋ฏ€๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ถ€์ •์ ์œผ๋กœ ๋“ค๋ฆด ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์‚ฌ๊ณผํ•˜์„ธ์š”. ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(TS์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ).
๋˜ ๋‹ค๋ฅธ ์˜ˆ(์ €๋Š” TS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ES5๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์บ์ŠคํŒ…, ์„ ์–ธ, ์ธํ„ฐํŽ˜์ด์Šค ์—†์Œ)

// do-as-i-tell-you-start
const factory = () => {
  const _this = [];
  let _value;
  Object.defineProperties(_this, {

    // Error: Property 'getset' does not exist on type 'any[]'.
    // true at at creation but not when used โ€“ don't MOM me!
    'method1': { value(){ return _this.getset; } },   

    // Works with property strings โ€“ I don't want this
    'method2': { value(){ return _this['getset']; } }, 

    'getset': { get(){ return _value; }, set(value){ _value = value } },
  });
  return _this;
}

์ƒ์„ฑ ์‹œ์—๋Š” ์‚ฌ์‹ค์ด์ง€๋งŒ ์‚ฌ์šฉ ์‹œ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ TypeScript๊ฐ€ ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋ฐ ์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ง€์ ํ–ˆ๋“ฏ์ด ์—ฌ์ „ํžˆ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ด๋ฏธ ์ž์‹ ์˜ ์œ„ํ—˜์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. TypeScript๋ฅผ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ๋ค๋คํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

TypeScript๋ฅผ ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ๋ค๋คํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

ํŒ€์„ ES5 => ES6(Babel ๋˜๋Š” TS) => TS์—์„œ ๋ชจ๋“  ์˜๊ด‘์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ธ์ƒ์€ TS๊ฐ€ JS์— ์ถ”๊ฐ€๋˜์–ด ํ˜„์žฌ ์ˆ˜์ค€์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด ๋ถˆ๋งŒ์˜ ์ด์œ ๋Š” ์ œ๊ณต๋œ ๋”๋ฏธ ์˜ˆ์ œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ _does
ES5_๋ฅผ ์ƒ์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IMO ํ†ต๊ณผ ๋ฆฐํŒ…์€ ํŠธ๋žœ์ŠคํŒŒ์ผ์— ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ฐฉ์ถœ์ด ์—†์œผ๋ฉด ๋ฐฉ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ES5๋ฅผ ์ƒ์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ โ€“ Babel๋กœ ์ „ํ™˜ โ€“ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค

tsc ๋Š” ์œ ํ˜• ์˜ค๋ฅ˜์— ๊ด€๊ณ„์—†์ด ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. noEmitOnError ์˜ต์…˜์„ ์‚ดํŽด๋ณด์„ธ์š”.

ts-loader๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ๋ณ€ํ™˜ํ•˜๋Š” ์ƒˆ๋กœ์šด transpileOnly ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@trusktr ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค - ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค :-)

์˜ค๋ฅ˜๋Š” ์ถœ๋ ฅ ์ƒ์„ฑ์„ ๋„๊ตฌ ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๊ทธ๊ฑด ์‚ฌ์‹ค์ด ์•„๋‹ˆ์•ผ. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š” webpack ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋Œ์•„๊ฐ€์„œ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๊ฐ€ "์ž‘๋™"ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํŒ€์ด ์œ ํ˜•์„ ๋ฌด์‹œํ•  ๋•Œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ ์‚ฌํ•˜๊ฒŒ tsc๊ฐ€ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•˜๋ฉด ์ž๋™ ์ƒˆ๋กœ ๊ณ ์นจ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์˜๋„์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒฝ์šฐ).

์˜ค๋ฅ˜ ์–ต์ œ๋Š” tsc์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface A {
  isEmpty(x: any[] | string | object): boolean;
}

const a: A = <A>{};
a.isEmpty({a: 1});

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ TS ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๊ณ ์ • ํ•จ์ˆ˜ ํ˜ธ์ถœ(์ž˜๋ชป๋œ ์ค„ ๋ณต์‚ฌ)

์— ์˜ํ•ด

a.isEmptyObject({a: 1});

๋„ค ๋ง ๋œป์€

a.isEmpty({a: 1});

?

์–ด ๊ทธ๋ž˜. ์ž˜๋ชป๋œ ์ค„์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค:/.

์˜ค๋ฅ˜ ์–ต์ œ๋Š” tsc์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ์ถœ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๋•Œ tsc๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฉ์ถœํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

import * as reducers from "./**/reducer.ts"

TypeScript๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•œ ๋‹ค์Œ Babel์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ * ๋ฅผ glob ํŒจํ„ด์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. TypeScript๋Š” .ts ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋˜์ง„ ๋‹ค์Œ .ts ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ์ด ์ค„๊ณผ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์—์„œ ๋ชจ๋“ˆ ๋งคํ•‘์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ * ๋„ ์™€์ผ๋“œ ์นด๋“œ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ด์Šค์ผ€์ดํ”„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ .d.ts @lukescott :

declare module './**/reducer' {
  export = {
    [reducer: string]: () => void; /* or whatever */
  };
}

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์œ ์šฉํ• ์ง€์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ˆ:

const req = https.request({
        host: 'www.google.com',
        method:'GET',
        path:'/',
        port: 443,
}, (res) => { 
    console.log(res.connection.getPeerCertificate());
});

getPeerCertificate ๋Š” ๋…ธ๋“œ https ( ๋˜ํ•œ this )์˜ ์ž˜๋ชป๋œ ์ •์˜ ๋กœ ์ธํ•ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํฐ ๋นจ๊ฐ„์ƒ‰ ๋ฐ‘์ค„๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ์ž‘๋™ํ•˜์ง€๋งŒ ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

console.log(res.connection.getPeerCertificate()); //ts:disable-line

@trusktr
์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. prod ์ฝ”๋“œ์—์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ตฌ๋ฌธ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์— ๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์˜ js plunk๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ‘์ค„ ์ •์˜์— ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ts ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ฝ”๋“œ ์ค„์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

+1. ๋‚ด ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ํ•ญ๋ชฉ์— ์ „๋‹ฌ๋  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์€ null ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ! ์˜ ์ผ๋ฐ˜ํ™”์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ(์˜ˆ: Chartjs)๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ข…์ข… TS ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ TS๋กœ ์œ ์ง€ํ•˜๊ณ  JS๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค). ์‚ผ์ค‘ ์Šฌ๋ž˜์‹œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TS๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ•„์š”๋กœ ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TypeScript๋Š” ํ•ด๋‹น ํŒŒ์ผ์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋์—†์ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค(๋‹น์—ฐํžˆ TS๋กœ ์ €์žฅ๋˜๋Š” ํ‘œ์ค€ JS ํŒŒ์ผ์ผ ๋ฟ์ž„).

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ:

/*ts-errors-disable*/ ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ, /*ts-errors-enable*/ ๋ฅผ ๋ ๋ถ€๋ถ„์œผ๋กœ ํ•˜๋ฉด ๊ด€๋ จ์ด ์—†๋Š” ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด ์ค„์–ด๋“ค์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ TS๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@benfrain ๊ธ€์Ž„, ํ•ด๋‹น TypeScript ์ •์˜ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜( npm install --save-dev @types/mylibrary ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— any ์œ ํ˜•์˜ ๊ณ ์œ ํ•œ _.d.ts_ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. /๋ฉ”์ธ ํด๋ž˜์Šค ๋จผ์ €:

// mylibrary.d.ts
declare module "mylibrary" {
    let mylibrary: any;
    export = mylibrary;
}
// main.ts
import mylibrary = require("mylibrary");
...

์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ฝ”๋“œ์™€ TypeScript๊ฐ€ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ๋Š” ์˜ค๋ฅ˜:

import {Directive, ElementRef, Input, OnChanges, SimpleChange} from '@angular/core'

@Directive({
  selector: '[blankAttr]',
})
export class BlankAttr implements OnChanges {
  @Input('blankAttr') private attrName: string // <--- TS Error: unused variable

  constructor(private el: ElementRef) {}

  public ngOnChanges(changes: {[key: string]: SimpleChange}): void {
    const change: any = changes.attrName 
    const prevValue: any = change.previousValue

    if (prevValue) {
      this.el.nativeElement.removeAttribute(prevValue)
    }
    this.el.nativeElement.setAttribute(change.currentValue, '')
  }
}

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ์†์„ฑ์ด ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก @Input ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๊ฐ’์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด์ „ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ // ts-ignore ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์„ ๋ฉ‹์ง€๊ฒŒ ํ•ด๊ฒฐํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@uglow attrName ๋น„๊ณต๊ฐœ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ์ด๊ฒƒ์€ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก Angular๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฐœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@jmlopez-rod ๊ณต๊ฐœ๋กœ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TS๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

TS 2.4.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. public typescript๋กœ ๋งŒ๋“  ํ›„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์ด ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.

์ „์—:
screen shot 2017-07-26 at 9 53 13 am

ํ›„์—:
screen shot 2017-07-26 at 9 53 39 am

2.3.3์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2.4.1์„ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š

์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ .js ํŒŒ์ผ์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • js ์—”์ง„์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ์š”์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค . TS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฌผ๋ก  TS๋Š” ์ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๋‹ค์Œ์„ ๋˜์ง‘๋‹ˆ๋‹ค.

A 'return' statement can only be used within a function body.

noUnusedLocals ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•ด์•ผ ํ•˜๋Š” ์ƒˆ๋กœ์šด SO ์งˆ๋ฌธ:
https://stackoverflow.com/questions/45519476/is-it-a-typescript-antipattern-to-dynamically-call-a-member-function-stored-in-a

@mhegazy ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋ฅผ

๋‚ด ํ˜„์žฌ ์ƒํ™ฉ(์ „์ฒด ํ๋ฆ„์€ ์„ ์–ธ ๋ชจ๋“œ๋ฅผ ๊ฐ€์ •ํ•จ):

  • ํด๋ž˜์Šค ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค ์„ ์–ธ(ํด๋ž˜์Šค ํ‘œํ˜„์‹์ด ์•„๋‹˜)์ด ํ•„์š”ํ•˜๊ณ  ์ €๋Š” ํ•จ์ˆ˜ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์€ ๊ณ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋Š˜์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋„ค, ๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. ํ‘œํ˜„์‹์„ ์„ ์–ธ์œผ๋กœ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์‚ฌ์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ์„ ์–ธ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•Œ์•˜์–ด, ๋ฌธ์ œ์—†์–ด ๋‚ด๊ฐ€ ๋Œ๋ ค์ค„๊ฒŒ
  • ์ฃผ์‚ฌ์œ„ ์—†์Œ, Return type of public method from exported class has or is using private name
  • ... ?

๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๊ธฐ์„œ ๊ทผ๋ณธ ์›์ธ์€ ํ‘œํ˜„์‹์„ ์žฅ์‹ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์ง€๋งŒ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ์—๋Š” ๋‹จ์ˆœํžˆ ์ด ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ TypeScript ๋ฌธ์ œ๋ฅผ ์ฐพ๊ณ  // TS-LIMITATION:#9448 ์™€ ๊ฐ™์€ ๋ง์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฌด์˜๋ฏธํ•œ ๋ฌธ์ œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•ด ํŠน์ • ๋Œ€์ƒ ์–ต์ œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๊ดœ์ฐฎ๊ฒ ์ง€๋งŒ, ๋„ˆ๋ฌด ๋งŽ์€ ์„ค๊ณ„ ๋…ธ๋ ฅ ์—†์ด ์‹ ์†ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ ๊ฒฝ์šฐ์—๋งŒ(๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋ฌด์˜๋ฏธํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค :wink: )

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if (false){ ...complicated debug code that I dont want to delete/forget... }

๋”ฐ๋ผ์„œ TypeScript ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” "์ข…๋ฃŒํ•˜๊ณ  ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์Œ" ์˜ต์…˜์ด ์—ฌ์ „ํžˆ ์—†์Šต๋‹ˆ๋‹ค. ํŠน์ • ํŒŒ์ผ์ด๋‚˜ glob์— ๋Œ€ํ•œ ์ฃผ์„๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ ์Šค์œ„์น˜๋ฅผ ํ†ตํ•ด ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž๋™ ์ƒˆ๋กœ๊ณ ์นจ์„ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๋ฒ„์ „์˜ ๋„๊ตฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ ์ตœ์‹  ๋ฒ„์ „์€ ์ž๋™ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์Œ). ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” noImplicitAny ์˜ต์…˜์„ ๋„๊ฑฐ๋‚˜(์ •๋ง ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Typechecking ๋•Œ๋ฌธ์— TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์•”์‹œ์ ์œผ๋กœ ํ—ˆ์šฉ๋œ ๋ชจ๋“  TypeScript๋Š” ํ…Œ์ด๋ธ”์— ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค) ํŒจํ‚ค์ง€์˜ ๊ณ ๋Œ€ ๋ฒ„์ „์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, WebPack ๊ณผ AwesomeTypeScript ๋กœ๋” ๋ชจ๋‘์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ–ˆ์ง€๋งŒ ์•„๋ฌด๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ˜„์žฌ ์—ฌ๋Ÿฌ ๋‹ฌ ๋™์•ˆ ๋ฌด์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด TypeScript ํŒจํ‚ค์ง€์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค :-(.

@polyglotinc if (!!false) {

@RyanCavanaugh ๊ธ€์Ž„, ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด (!true) ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ... ๋‚˜๋Š” _(์ „ ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž๋กœ์„œ)_ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์ˆ˜/๋ฆฌํ„ฐ๋Ÿด๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋” ๋งŽ์€ ์‹ ์šฉ์„ ์ œ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์ƒ๊ฐ์กฐ์ฐจํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค . expression collapsing... if (false) ์— ๋Œ€ํ•ด ๋ฐ”์œ ๋ณธ๋ฌธ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด if (!true) ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์ž„์„ ์•Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@unional SO ์งˆ๋ฌธ ์€ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์•Œ๋ ค์ค„ ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ด์œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์–ต์ œํ•˜๋ ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ด ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

screen shot 2017-08-09 at 12 43 20 am

์Šคํฌ๋ฆฐ์ƒท์—๋Š” ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žก์€ ๋ฌธ์ œ ํ•˜๋‚˜๋ฅผ ์ด๋ฏธ ์ˆ˜์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

private keyHandlers = {
    'ArrowDown': function ($event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

์‚ฌ์šฉ์ž๋Š” handleArrow* ์ด ์‚ฌ์šฉ ์ค‘์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ typescript๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ตญ์ธ ํƒ€์ดํ”„๊ฐ€ ์šฐ๋ ค๋กœ this ์—์„œ this.handleArrowDown($event); ๋ฐฉ๋ฒ•์ด์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ ์ผ ์ˆ˜ handleArrowDown . ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ this ๊ฐ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ž„์„ ์•Œ๊ณ  handleArrowUp ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜: ๊ฐ€์งœ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ this .

  private keyHandlers = {
    'ArrowDown': function (this: SomeComponent, $event: any) {
      this.handleArrowDown($event);
    },
    'ArrowUp': ($event: any) => {
      this.handleArrowUp($event);
    },
  };

@jmlopez-rod ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ์ข‹์€ ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํŠนํžˆ function(this: SomeComponent, ...) {...} ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

keyHandlers ๊ฐ€ ํด๋ž˜์Šค์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

const keyHandlers = {
  'ArrowDown': function (this: SomeComponent, $event) {
    this.handleArrowDown($event); // error on accessing private method, filing an issue for it.
  },

  'ArrowUp': ($event) => { // doesn't work, duh
    this.handleArrowUp($event);
  }
}

export class SomeComponent {
  onKeyDown($event) {
    if (typeof keyHandlers[$event.code] === 'function') {
      keyHandlers[$event.code]($event);
    }
  }
  private handleArrowDown(_event) {
    // ...
  }

  private handleArrowUp(_event) {
    // ...
  }
}

๋ฐ˜๋ฉด์— ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์€ ์ด ์ปจํ…์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

console.log ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด IE9์— ๋Œ€ํ•ด window.console ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

if (!window.console)
    window.console = {};

ํ•˜์ง€๋งŒ error TS2540: Cannot assign to 'console' because it is a constant or a read-only property. ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@amiraliakbari window ๋ฅผ any ์œ ํ˜•์œผ๋กœ ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(window as any).console = {};

์ด๊ฒƒ์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ console.log ๋ฅผ ์žฌ์ •์˜/๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค -- Project.logging ๊ฐ€ ์ด ์ „์— ์ •์˜๋˜์—ˆ์Œ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค

(window.console as any).___real_log = window.console.log;
window.console.log = function(args) {
  if (Project.logging) return (window.console as any).___real_log(args);
  return;
};

์ด๊ฒƒ์€ ๋˜ํ•œ console.log ๋ฅผ ํ‰์†Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ์ฝ”๋“œ ์ „์ฒด์— if ๋ฌธ์„ ๋„ฃ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊นจ๋—ํ–ˆ์Šต๋‹ˆ๋‹ค.

#19109์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

#19109์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์ƒ์„ฑ #19139.

์ด ๋ช…๋ น์€ ํŒŒ์ผ๋ณ„๋กœ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”? ํด๋”์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช…๋ น์€ ํ•œ ๋ฒˆ์— ํ•œ ์ค„์— ๋Œ€ํ•ด ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋งŽ์ด๋ณด๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๋œ ์—„๊ฒฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜ ๊ณผ ๊ฐ™์€ ๋– ๋‚˜๋Š” ๋“ฑ, noImplicitAny ์˜คํ”„ (์ฆ‰, ๋ณ€์ˆ˜๋Š” ์•”์‹œ์ด๋‹ค any ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ฃผ์„). ์ผ๋ถ€ ํŒŒ์ผ์„ JS๋กœ ๋‚จ๊ฒจ๋‘๊ณ  allowJs ๋ฅผ ์ผœ๊ณ  checkJs ๋Œ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์†”๋ฃจ์…˜์ด ์•„์ง ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ์™œ ์ œ๋Œ€๋กœ ๋œ ์˜ค๋ฅ˜์–ต์ œ ๊ฐ€๋Šฅ์„ฑ์„ ํ†ตํ•ฉํ•˜์ง€ ์•Š๊ณ  2๋…„ ๋™์•ˆ ๋ฌด์˜๋ฏธํ•œ ํ† ๋ก ์„ ํ•ฉ๋‹ˆ๊นŒ?

@webia1 ์•„์ง ์—ด๋ ค ์žˆ๋Š” #19139์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋‚˜์ฒ˜๋Ÿผ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์ฃผ์„์„ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.)

https://github.com/Microsoft/TypeScript/pull/21602๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// @ts-ignore ๋ฅผ ์ฝ”๋“œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค (๋˜๋Š” ์ง€์ •๋œ ์˜ค๋ฅ˜๋งŒ ๋ฌด์‹œํ•˜๋ ค๋ฉด // @ts-ignore <some code error> ๊นŒ์ง€) .

์—ฌ๊ธฐ์„œ TypeScript 2.7.2๋กœ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

(๋˜๋Š” ์‹ฌ์ง€์–ด // @ts-ignore์ง€์ •๋œ ์˜ค๋ฅ˜๋งŒ ๋ฌด์‹œ).

21602๊ฐ€ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŠน์ • ์˜ค๋ฅ˜๋งŒ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@RyanCavanaugh ๋งž์Šต๋‹ˆ๋‹ค! ๋‚ด ์˜๊ฒฌ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์˜ค๋ฅ˜ TS2339๋ฅผ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

document.getElementById('theme-admin').disabled = false; /* tslint:disable */
document.getElementById('theme-member').disabled = true; /* tslint:disable */
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰