๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ts ์ค๋ฅ ์์ ์ฃผ์์ ์ถ๊ฐํ ์ ์์ด์ผ ํฉ๋๋ค.
/// TS_IGNORE
let a:string = 1
์ปดํ์ผ๋ฌ๊ฐ ํด๋น ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ์ง ์๋๋ก ํ์ญ์์ค...
๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ์ ์๊ณ ์๊ณ ์ค๋ฅ ๋ณด๊ณ ์๋ฅผ ์กฐ์ฉํ๊ฒ ๋ง๋ค๊ณ ์ถ์ดํ๋ ํน์ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
๊ฐ์ ์ข ๋ฅ : ์๋ฌด๊ฑฐ๋
๋ฌธ์ ์ธ์ฌ
์
๋์. 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๊ฐ ํธ์ถ๋ฉ๋๋ค...
์ด๊ฒ์ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค
// 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์์ ๋ช ๊ฐ์ง ์์ ์ ์ํํ์ต๋๋ค.
declare module "@angular\*";
๋ฅผ ๋นํ์ฑํํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ํ์ฉํ๋ ๋ชจ๋ ์ด๋ฆ์ ์ฝ์ ์ฐ๋น์ธํธ ๋ชจ๋ ์ ์ธ ๋ฐ ์์ผ๋์นด๋ ๋ฌธ์๋ฅผ ์ง์ํฉ๋๋ค..d.ts
ํ์ผ์ ์
๋ ฅํ์ง ์์ผ๋ ค๋ฉด ์ --skipLibCheck
--typeRoots
๋ฅผ ์ง์ํ์ฌ ์ ์ธ ํ์ผ์ด ๋ก๋๋๋ ์์น๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.๊ทธ๋ฅ ์๋ฌด๊ฑฐ๋ ์ฌ์ฉํ์ญ์์ค. ์ด๊ฒ์ "๋ฅ์ณ", ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ์ฅ์ (๋๋ ์ค์ ๋ก ๋ถ์กฑํจ)์ ๋ค๋ฅธ ์ง๋ฌธ์ ๋๋ค.
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
๋ฉ์๋์๋ ์์ฒด ํ์ ์ ์ธ๋ ์์ต๋๋ค.
์ง๊ธ์ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ด ์ป๋ ์ค๋ฅ๋ ๋ฌด์์ ๋๊น?
๋ด ์ฝ๋๋ ๋ ธ๋์ ๋ธ๋ผ์ฐ์ ์ ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์คํ๋ฉ๋๋ค. ๋ ๋ฒ์งธ ์ปจํ ์คํธ์ ํ์ฌ ๋ฌธ์ ๋ ์ ํ ์ฃผ์ ๋ฐ ์ฝ๋ ์์ ์ ๋๋ค.
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>''}
๊ทธ๊ฒ์ ์ค์ ๋ก ๊ทธ๊ฒ์ ๊ณ ์น ์ ์์ต๋๋ค.
์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
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๋ก ๋ง๋ ํ ์ค๋ฅ ๋ฐ์์ด ์ค์ง๋ฉ๋๋ค.
์ ์:
ํ์:
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 ์ง๋ฌธ ์ ์กฐ๊ธ ๋ ๋ช ํํ๊ฒ ์์ฑ๋ ์ ์์ผ๋ฉฐ ์๋ง๋ ์ด๊ฒ์ด ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ๋ฅํ ์ค๋ฅ์ ๋ํด ์๋ ค์ค ํ์๊ฐ ์๋ ์ด์ ์ผ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ต์ ํ๋ ค๋ ์ค๋ฅ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ด ์คํฌ๋ฆฐ์ท์ ์ฐธ์กฐํ์ญ์์ค.
์คํฌ๋ฆฐ์ท์๋ ํ๋์ ์ค๋ฅ๋ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ก์ ๋ฌธ์ ํ๋๋ฅผ ์ด๋ฏธ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
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
์ง์ ๋ ์ค๋ฅ๋ง ๋ฌด์).
@RyanCavanaugh ๋ง์ต๋๋ค! ๋ด ์๊ฒฌ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ค๋ฅ TS2339๋ฅผ ์ต์ ํ๊ธฐ ์ํด ์ฌ๊ธฐ์ ๋์ฐฉํ์ต๋๋ค.
document.getElementById('theme-admin').disabled = false; /* tslint:disable */
document.getElementById('theme-member').disabled = true; /* tslint:disable */
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ทธ๋ฅ ์บ์คํ (์บ์คํ ์ ๊ณต์ ์ฉ์ด๊ฐ ์๋๋ผ ๊ฐ์ ๊ฐ๋ )
๊ทธ๊ฒ์ด ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ ๋๊น?