๋ชจ๋์ด implements
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์์์ ๋ ์ ์ฉํฉ๋๋ค. ๊ตฌ๋ฌธ : module MyModule implements MyInterface { ... }
.
์:
interface Showable {
show(): void;
}
function addShowable(showable: Showable) {
}
// This works:
module Login {
export function show() {
document.getElementById('login').style.display = 'block';
}
}
addShowable(Login);
// This doesn't work (yet?)
module Menu implements Showable {
export function show() {
document.getElementById('menu').style.display = 'block';
}
}
addShowable(Menu);
์ด๊ฒ์ด ์ธ๋ถ ๋ชจ๋๊ณผ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ์ฌ๋๋ค์ด ๋ด๋ถ ์ฉ์ผ๋ก ์ฌ์ฉํ ์์๊ฒ๋๋ฉด ์ธ๋ถ ์ฉ์ผ๋ก๋ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
๊ทธ๊ฑด ์ข์ ์ง๋ฌธ์ด์ผ. ์ด๋ค ๊ตฌ๋ฌธ์ด ๊ฐ์ฅ ์ข์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ ์์ด ์์ต๋๋ค.
implements Showable; // I would prefer this one.
module implements Showable;
export implements Showable;
๋ด๋ณด๋ด๊ธฐ ํ ๋น์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ด๋ณด๋ด๋ ํญ๋ชฉ์ด ์ด๋ฏธ ๋ค๋ฅธ ์์น์ implements
์ (๋ฅผ) ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ๋ด๋ณด๋ด๊ธฐ ํ ๋น์ ์ฌ์ฉํ์ง ์๋ ์ธ๋ถ ๋ชจ๋์์๋ง ํ์ฉ๋์ด์ผํฉ๋๋ค.
์น์ธ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค.
export implements Showable;
export =
ํ์ผ ํ ๋น์๋ ์ด๊ฒ์ด ํ์ํ์ง ์๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค.
๋ช ๊ฐ์ง ์ถ๊ฐ ์ง๋ฌธ :
declare module "Module" implements Interface { }
import i : Interface = require("Module");
module Foo {
export interface IBar {
(a:string): void;
}
export module Bar implements IBar { // should this be an error?
export interface Interface {}
}
function Bar(a: string) : void { } // not exported
}
var bar: Foo.IBar = Foo.Bar;
์ฃผ๋ณ ์ธ๋ถ ๋ชจ๋์์ ํ์ฉ๋์ด์ผํฉ๋๋ค. ์ด ๋ชจ๋์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๊ตฌ๋ฌธ์ด ์ ์๊ฐ์ ํ์ฉ๋์ด์ผํฉ๋๋ค.
declare module "first" implements Foo { }
declare module "second" {
interface Bar { }
export implements Bar; // this syntax is necessary, with the first syntax you can't reference Bar.
}
์๋๋ฉด Bar๊ฐ {
์ ์ ๊ตฌํ ์ ์ ๋ฒ์์ ์์ด์ผํฉ๋๊น?
์ ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ์์ฒด์ ์ถ๊ฐ ํ ์ ์๊ธฐ ๋๋ฌธ์ import ๋ฌธ์ ์ ํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์๊ฐ์๋ ์ค์ ๋ก ์ ์ฉํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณํฉ ๋ ์ ์ธ์ ๊ฒฝ์ฐ ๊ตฌํ ์ ์ ํฌํจํ๋ ๋ชจ๋ ๋ธ๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํฉ๋๋ค. ๋ํ ๊ฐ์์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์ด๊ฒ์ด # 2159์ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ๋ค์ ์คํ์ด์ค๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๊น?
@jbondc ์ด๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ค์ ์คํ์ด์ค์๋ ์ ์ฉ๋ ๊ฒ์ ๋๋ค. ๋ด๋ถ ๋ชจ๋๊ณผ ๋ค์ ์คํ์ด์ค๋ ๋ํ์ผ๋ก ์๊ฐํด์ผํฉ๋๋ค.
"๋ค์ ์คํ์ด์ค"๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์์๋ ๊ตฌํ ๊ฒฝ๋ก๋ก ์ด๋ ํ์๊ฒ ์ต๋๊น?
์ค ์์ฐ, ์ด๊ฒ์ ๊ฝค ์ค๋ซ๋์ ์น์ธ๋์์ต๋๋ค. @RyanCavanaugh , @DanielRosenwasser , @mhegazy ๋น์ ์ด ๋ ๋ฒ์งธ ์๊ฐ์ด๋ ์กฐ์ ์ด ์๋ค๋ฉด ๋๋ ์๋ง๋ ์ด๊ฒ์ ๊ณง ๊ตฌํํ ๊ฒ์ ๋๋ค.
๋๋ ์ด์ ์ ํ์๋ก ์ ์ฒ ํํ๊ณ ์ค์ ๋ก ๊ทธ๊ฒ์ด ๊ฐ์ ธ์ฌ ์๋ก์ด ๊ตฌ์กฐ์ ๊ฐ๋ฅ์ฑ์ ์ํด ํด์ฅํ์ต๋๋ค.
์ด์ ๋ฐ๋ผ ๊ตฌํ์ ์ ์ธํ๋ ๋ธ๋ก ๋์ ์ธํฐํ์ด์ค ์งํฉ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ์ํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋ค์ ์คํ์ด์ค / ๋ชจ๋์ ํน์ฑ์ ๋ถ์ฐ๋์ด ์๊ณ ์ฌ์ํ์ง ์์ ๋ง์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ๋์ผํ ํ์ผ์ ์ ์ฒด ๋ค์ ์คํ์ด์ค / ๋ชจ๋์ ์ ์ํ๊ณ ์ถ์ง๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@ Elephant-Vessel ๋ชจ๋, ๋ค์ ์คํ์ด์ค, ํจํค์ง ๋๋ ๊ธฐ๋ฅ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@aluanhaddad ๋ฌด์จ ๋ง์ด์ผ?
์ด ํ ๋ก ์ด ์์๋ ์์ ์ ๋ชจ๋์ด ์ค๋๋ ์๋ฏธํ๋ ๋ฐ๊ฐ ์๋์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด์ ๋ค์ ์คํ์ด์ค๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ฌ OP์์ ๋ชจ๋๋ก ์ค๋ช ๋ ๊ฒ์ ์ฐธ์กฐํ๋ ๋ฐ๋ฉด ๋ชจ๋์ ๋ ์ ํํ๊ณ ํธํ๋์ง ์๋ ์๋ฏธ๋ฅผ ์ทจํ์ต๋๋ค. ๋ฐ๋ผ์์ด ๊ตฌํ์ ์ฐธ์ฌํ๋ ์ฌ๋ฌ ํ์ผ์ ๋ํด ์ด์ผ๊ธฐ ํ ๋ ๋ค์ ์คํ์ด์ค ๋๋ ๋ชจ๋์ ์ธ๊ธํ๊ณ ์์ต๋๊น?
๋๋ ๋ค์ ์คํ์ด์ค๋ฅผ ์ธ๊ธํ๊ณ ์๋ค. ์ด ์ค๋ ๋์ ์ญ์ฌ๋ฅผ ๋ฐ๋ฅด๊ณ ์ถ์ ๋๋ด์. ๋์จํด์ง์ง ์์์ ๋ฏธ์ํฉ๋๋ค. ์์คํ ์์ ํน์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์กฐ๋ฆฝ ๋ ํ์ ๊ตฌ์ฑ ์์ ํ์ง๋ง '๋ค์ ์คํ์ด์ค'๋ง ์ฌ์ฉํ๋ฉด ๊ด์ฐฎ์ต๋๋ค.
๊ทธ๋์ typescript์ ๊ตฌ์กฐ์ ๊ฐ๋ ๋ค์ ์คํ์ด์ค ๋ฅผ ํ์ฉํ์ฌ ๋ค๋ฅธ [_generic modules_] ๋๋ ํด๋์ค๋ฅผ ํฌํจ ํ ์์๋ [_generic modules_]์ ๋ํ ์ ์ฝ๊ณผ ๊ธฐ๋์น๋ฅผ ์ค๋ช ํ๊ณ ์ ์ฉ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์ ํฌ๋ง์ ์ฐ๋ฆฌ๊ฐ ์์คํ ์์ ๋ ๋์ ์์ค์ ๊ตฌ์กฐ์ ๊ธฐ๋์น๋ฅผ ๋ ์ ํํํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํด๋์ค๋ ์ ํ์ฅ๋์ง ์๊ณ ์์คํ ์ ์์ ๊ตฌ์ฑ ์์๋ก๋ ๊ด์ฐฎ์ง ๋ง ์ธ์คํด์คํ๋๊ณ ์์๋๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก ์์คํ ์ ์์ ์์ค ์กฐ์ง ๊ตฌ์กฐ๋ฅผ ํด๋์ค๋ก ํํํ๋ ๊ฒ์ด ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. . ๋๋ฌด bloaty์ ๋๋ค.
์์คํ ์ ๊ณ ์ฐจ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ๊ณ ๊น๋ํ๊ฒ ์ค๋ช ํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๋ฐ๋์งํ๊ฒ๋ ์ ํ์ ์ธ ๋ฐฉํฅ ๊ฐ์์ฑ ์ ์ฝ์ด ์ ์ผํ ์๋์ ๋๋ค. _MySystem.Infrastructure_์์ _MySystem.ClientApplication_์ ์ฐธ์กฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ํฅ๋ฏธ๋ก์ด ๊ณณ์ผ๋ก ๊ฐ๊ธฐ ์์ํฉ๋๋ค.
@ Elephant-Vessel์ ๋ช ํํ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋งค์ฐ ๊ฐ์น ์๊ณ ํด๋์ค ์ ํ์ด ์ฌ๊ธฐ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ค์ ์คํ์ด์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ๊ฐ๋ ์ ์ผ๋ก ๋จ์ผ ํญ๋ชฉ์ ๋ํ ๋ด๊ธฐ ๋๋ฌธ์ ์ธ์คํด์คํ์ ๋ํด ์ด์ผ๊ธฐ ํ ๋ ๋จธ๋ฆฌ๋ฅผ ์ฐ๋ ๋ค ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ์ ๋ ์๋ ์์ง๋ง ์ฌ๋ฌ ์ธ์คํด์คํ๋ฅผ _imply_ํ์ง ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด ๊ฐ๋ ์ ์ผ๋ก ์ ์ฉ ํ ๊ฒ์ ๋๋ค.
@ Elephant-Vessel์ ๋์ํฉ๋๋ค. ๋ชจ๋ ์ ์ฝ์ด ๋จ์ผ ํด๋์ค ๊ตฌ์กฐ๋ก ํํ๋๋ ๋ค๋ฅธ Java๋ก TypeScript๋ฅผ ์ฐฉ๊ฐํ๊ธฐ ์ฝ์ง๋ง TS๋ ํจ์ฌ ๋ ๊ด๋ฒ์ํ "Shape"๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด๋ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ์๋ฏธ ์ ์๊ณก์ ์ ๊ฑฐํฉ๋๋ค. ์ํ๊น๊ฒ๋ ๋ชจ๋์ ์ ์ฝ์ ์ ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ๋ชจ๋๋ก ํจ์ฌ ๋ ์ ํํํ ์์๋ ํด๋์ค ํจํด์ผ๋ก ๋๋์ ๊ฐ๊ฒ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋จ์ ํ ์คํธ์ ๊ฒฝ์ฐ ํน์ ์คํ ์ปจํ ์คํธ์ ๋ํ ๋์ฒด ๊ตฌํ์ ์ ๊ณต ํ ์ ์๋๋ก ๋ชจ๋์ "๋ชจ์"(์ฆ, ์ ์ฝ ์กฐ๊ฑด)์ ํํํ ์ ์์ผ๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด์ ๊ตฌ์กฐ / ํ์ธ ๋ ๋ฐฉ์์ผ๋ก์ด๋ฅผ ์ํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ํด๋์ค ๊ธฐ๋ฐ DI (La Spring)๋ก ๋์๊ฐ ๋ชจ๋ ๊ฒ์ ํด๋์ค๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค (๋ฐ๋ผ์ ์ธ์คํด์คํ ๊ฐ๋ฅ).
์ด์จ๋ , ๋๋ @ Elephant-Vessel์ ์์ญํ๊ณ ์์ง๋ง TS์ ๋ํ ํ๋์ ์์์ด ์๋ค๋ฉด ์ด๊ฒ์ ์ด๊ฒ ์ผ ๊ฒ์ ๋๋ค.
์ด ์์ ๋ํ ๋ง์? ์ด ๋ฌธ์ ๋ ์์ต๋๋ค
soooo, uhh, ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒฝ์ฐ๊ฐ ์๋๊น์?
export {} as IFooBar;
๊ทธ ๊ตฌ๋ฌธ์ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ๊ตฌ๋ฌธ์ด ์ด๋ฏธ ์น์ธ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
export implements IFooBar
์ด์จ๋ ๊ทธ๊ฒ์ ๊ธฐ๋
์์ง ์ ํ / ์ฐฉ๋ฅ ํ์ต๋๊น? ์ด๊ฒ์ ๋ฉ์ง ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ ๋๋ค
์ด๋ป๊ฒ ์งํํ ์ ์์ต๋๊น? ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๊ฐ๋ ฅํฉ๋๋ค. ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค!
์ด birb์ ์ด๋ค worb? ํ์ฌ ํ ๊ฐ์ง ์ง๋ฌธ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์ ์ธ ํ ์ ์๋๊ฐ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด :
export default {}
๋ด๊ฐ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
const x: MyInterface = {}
export default x;
๋๋ถ๋ถ์ TS ํ์ผ์์ ์๋ ํ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๋ JS๋ฅผ ๋จผ์ ์ฝ๋ฉํ๊ณ ๋์ค์ TS๋ก ์ ํ ํ ๊ณํ์ด๋ผ๋ฉด ์ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์๊ฐํ๊ณ ์๋ ๋ ๋ค๋ฅธ ๊ฒ์ ๊ตฌํํ๋ ๋ค์ ์คํ์ด์ค๋ ์ด๋ป์ต๋๊น? ๋ค์๊ณผ ๊ฐ์ ๊ฒ :
export namespace Foo implements Bar {
}
Bar๋ _abstract_ namespace lol idk๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์ง๋ฌธ์ด ๋๋ฌด ๋ง์ด ๋ ์ค๋ฅด๋ ๊ฒ์ ๋ณด์๊ณ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ํ ๊ฐ์ง๋ฅผ ์ฐพ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ธํฐํ์ด์ค์์ ์ ์ ๋ฉค๋ฒ๋ฅผ ์ง์ํฉ๋๋ค.
๊ทธ๋ด ๊ฒฝ์ฐ ์ ์ ๋ฉค๋ฒ์ ์ธํฐํ์ด์ค๊ฐ์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ํ๋ ค๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋๊ฐ์ฃ ?
์ด๋ ์ชฝ์ด๋ ์ธํฐํ์ด์ค์ ์ ์ ์ง์์ ์ถ๊ฐํ๊ฑฐ๋ ๋ชจ๋์ ๋ํ ์ธํฐํ์ด์ค ์ง์์ ์ถ๊ฐํด์ผํฉ๋๋ค.
@shiapetel ์๋์์.
์ฐ๋ฆฌ๋ ํ ์์์ด:
export default <T>{
foo: Foo,
bar: Bar
}
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค์์ ์ฐพ๊ณ ์์ต๋๋ค.
export const foo : Foo = {};
export const bar : Bar = {};
๊ทธ๋ฌ๋ ํ์ฌ ๋ชจ๋์ด foo์ bar๋ฅผ ๋ด๋ณด๋ด๋๋ก ๊ฐ์ ํ๋ ๋ฉ์ปค๋์ฆ์ ์์ต๋๋ค. ์ฌ์ค ๋ชจ๋์ด ์ฌ๋ฐ๋ฅธ ๊ธฐ๋ณธ๊ฐ์ ๋ด๋ณด๋ด๋๋ก ๊ฐ์ ํ๋ ๋ฉ์ปค๋์ฆ๋ ์์ต๋๋ค.
์ธํฐํ์ด์ค๊ฐ ์ ์ ๋ฉค๋ฒ๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ค์์์ ์์ ๋ ์ ์ foo / bar๊ฐ์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ILoveFooBar {
์ ์ foo : FooType;
์ ์ ๋ง๋ : BarType;
}
๊ถ๋ฆฌ?
๊ทธ๊ฒ ์ ๊ฐ ์๋ฏธํ๋ ๋ฐ์
๋๋ค. ๋น์ ์ ์ํฉ์ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ฒ ํ์คํ ๋์์ด ๋ ๊ฒ์
๋๋ค.
@shaipetel ์ธํฐํ์ด์ค์ ์ ์ ๋ฉค๋ฒ๋ ํ์คํ ์ ์ฉ ํ ์ ์์ง๋ง์ด ์ฌ์ฉ ์ฌ๋ก์๋ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋๊ตฐ๊ฐ๊ฐ ๊ตฌํํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๊น?
ํ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ชจ๋์ ๋ํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์บํ๋ ํ๋ ์ ์ํฌ ๋ฐ ๋๊ตฌ๋ก, ํด๋น ๋ชจ๋์ด ๋ชจ๋ ํน์ ํํ๋ฅผ ๋ด๋ณด๋ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด Next.js๋ ํ์ด์ง ๋ชจ๋์ ๋ํด ./pages/**/*.{ts,tsx}
์ ์ค์บํ์ฌ ํ์ผ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ ๋ชจ๋์ด ์ฌ๋ฐ๋ฅธ ํญ๋ชฉ์ ๋ด๋ณด๋ด๋ ์ง ํ์ธํ๋ ๊ฒ์ ์ฌ์ฉ์์ ๋ชซ์
๋๋ค (๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ก NextPage
๋ฐ config
๋ผ๋ ์ ํ์ PageConfig
๋ด๋ณด๋ด๊ธฐ).
import { NextPage, PageConfig } from 'next'
interface Props { userAgent?: string }
const Home: NextPage<Props> = ({ userAgent }) => (<main>...</main>)
Page.getInitialProps = async ({ req }) => {
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent
return { userAgent }
}
export default Page
export const config: PageConfig = {
api: { bodyParser: false }
}
๋์ implements NextPageModule<Props>
์ ๊ฐ์ด ์ ์ฒด ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ ํํ๋ฅผ ์๋จ ๊ทผ์ฒ์ ํ ์ค๋ก ์ ์ธ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ ๋ค๋ฅธ ์๊ฐ : TypeScript ๊ตฌ์ฑ์ ํน์ ํจํด๊ณผ ์ผ์นํ๋ ๋ชจ๋ ํ์ผ (์ ./pages/**/*.{ts,tsx}
)์ด ํน์ ๋ด๋ณด๋ด๊ธฐ ํํ๋ฅผ ๊ตฌํํด์ผํ๋ค๋ ๊ฒ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด pages
๋๋ ํ ๋ฆฌ ๋ด์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ํ์ธ๋์์ต๋๋ค. ๊ทธ๋ฌ๋์ด ์ ๊ทผ๋ฒ์ ๋ํ ์ ๋ก๊ฐ ์๋์ง ํ์คํ์ง ์์ผ๋ฉฐ ํผ๋ ์ค๋ฌ์ธ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ๋จํ ๋ชจ๋์ด ํ์ํ ๊ฒฝ์ฐ Singleton ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์ ์ ํน์ ์์ฃผ ๋๋๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํธ์ ๋ด์ ๊ฐ๊ธฐ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค. ํด๊ฒฐ์ฑ
์ ๋ํ ๋ช ๊ฐ์ง ํ์ด๋ ๋๋ฌ ๋ณผ ๊ณณ์ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
2020 ๊ด์ ์์ ์ด๊ฒ์ ๋ํด ์๊ฐ ๋๋ ๊ฒฝ์ฐ ๋์ ๊ถ๊ธํด export implements Showable
์ฐ๋ฆฌ ์ฌ์ฌ์ฉ type
ํ์ฉ export
์๋ณ์๋ก? ์ค๋๋ ์ด๊ฒ์ ์๋ชป๋ ๊ตฌ๋ฌธ ์ด๋ฏ๋ก ๋ค๋ฅธ ์ฌ๋์ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ฐ์ ธ ์ค๊ธฐ ๊ตฌ๋ฌธ์ ์ป์ต๋๋ค.
// Can re-use the import syntax
type export = import("webpack").Config
์ ์ธ์ ์์ฑํ๊ธฐ ์ฝ์ต๋๋ค.
// Can use normal literals
type export = { test: () => string, description: string }
// Generics are easy
type export = (props: any) => React.SFC<MyCustomModule>
JSDoc ๋ฑ๊ฐ๋ฌผ๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
/** <strong i="17">@typedef</strong> {import ("webpack").Config} export */
^์ ๋ช ๊ฐ์ง ๋ฉ๋ชจ๊ฐ ์์ต๋๋ค. ํ์์์ ๋์จ ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ ์ ์ ์ค ์ผ์ด์ค๊ฐ ์๋ ์ ์ค ์ผ์ด์ค ์ธ ์ข ๋ ์ผ๋ฐ์ ์ธ ๋๊ตฌ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์์ด๋์ด์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ ํ ํธํ์ฑ์์ํ ์ ํ ์ด์ค ์ ์ฐ์ฐ์๊ฐ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํ์ด ์ํ๋ ๋ฐฉ์๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด :
type assert is import("webpack").Config
const path = require('path');
export default {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
}
};
๋ชฉํ๊ฐ ์๋ค๋ ๊ฒ์ ์ต์์ ๋ฒ์์ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ํฉ์ ๋ง๋ ํ์ดํ์ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค (์ : export default { en|
์์ ์๋ ์์ฑ ๋จ).
๊ทธ๋ฌ๋ ์์ ์ ์ ํ์ ๊ฒ์ฆํ๋๋ฐ๋ ์ ์ฉ ํ ์ ์์ต๋๋ค.
import {someFunction} from "./example"
type assert ReturnType<typeof someFunction> is string
JSDoc ๋ฑ๊ฐ๋ฌผ๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
js /** <strong i="7">@typedef</strong> {import ("webpack").Config} export */
@module
์ด JSDoc์ ํด๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ผ ์๋จ์๋ ๋ค์์ด ์์ด์ผํฉ๋๋ค.
js
/** <strong i="12">@module</strong> {import("webpack").Config} moduleName */
์ฐธ์กฐ : https://jsdoc.app/tags-module.html
Storybook v6์ Component Story Format ์ด๋ผ๊ณ ํ๋ ๊ตฌ์กฐํ ๋ ๋ชจ๋์ ๊ธฐ๋ฐ์ผ๋กํ๋ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ์ฝ๋๋ฒ ์ด์ค์ ๋ชจ๋ .stories.js/ts
๋ชจ๋์๋ Meta
์ ํ์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๊ฐ ํฌํจ๋์ด์ผํฉ๋๋ค.
๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ๋ ฅํ๋ ๊ธฐ์กด์ ๊ฒฐํจ ๊ณผ ๊ฒฐํฉํ์ฌ ์ด๋ฌํ ๊ธฐ๋๋ฅผ ๊ธ๋ก๋ฒ ๋ฐฉ์์ผ๋ก ํํํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ Storybook v6๋ฅผ TypeScript์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ด๋ฉ๋๋ค.
์์ถ, @jonrimmer์ ํฌ์ธํธ์ ์ถ๊ฐ ํ ์์๋ default
์ด๋ฉฐ ๊ทธ ์ด๋ค type
๋ณต์ ํ๋ module
๋๋ฌด - ์งํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค.
Webpack์๋ import * as Foo
ํ๋ค๋ฆฌ๋ ๋ฌธ์ ํธ๋ฆฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ ์ ๋ฉค๋ฒ์ ๋ํด export default const = {}
๋๋ export default class ModuleName {
๋ก ๋์ผํ ์์
์ ์ํํ๋ ค๊ณ ํ๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ์ ๊ฑฐ๋์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ชจ๋์ ๋ํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์บํ๋ ํ๋ ์ ์ํฌ ๋ฐ ๋๊ตฌ๋ก, ํด๋น ๋ชจ๋์ด ๋ชจ๋ ํน์ ํํ๋ฅผ ๋ด๋ณด๋ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด Next.js๋ ํ์ด์ง ๋ชจ๋์ ๋ํด
./pages/**/*.{ts,tsx}
์ ์ค์บํ์ฌ ํ์ผ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ ๋ชจ๋์ด ์ฌ๋ฐ๋ฅธ ํญ๋ชฉ์ ๋ด๋ณด๋ด๋ ์ง ํ์ธํ๋ ๊ฒ์ ์ฌ์ฉ์์ ๋ชซ์ ๋๋ค (๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋กNextPage
๋ฐconfig
๋ผ๋ ์ ํ์ PageConfig
๋ด๋ณด๋ด๊ธฐ).๋์
implements NextPageModule<Props>
์ ๊ฐ์ด ์ ์ฒด ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ ํํ๋ฅผ ์๋จ ๊ทผ์ฒ์ ํ ์ค๋ก ์ ์ธ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.๋ ๋ค๋ฅธ ์๊ฐ : TypeScript ๊ตฌ์ฑ์ ํน์ ํจํด๊ณผ ์ผ์นํ๋ ๋ชจ๋ ํ์ผ (์
./pages/**/*.{ts,tsx}
)์ด ํน์ ๋ด๋ณด๋ด๊ธฐ ํํ๋ฅผ ๊ตฌํํด์ผํ๋ค๋ ๊ฒ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ดpages
๋๋ ํ ๋ฆฌ ๋ด์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ํ์ธ๋์์ต๋๋ค. ๊ทธ๋ฌ๋์ด ์ ๊ทผ๋ฒ์ ๋ํ ์ ๋ก๊ฐ ์๋์ง ํ์คํ์ง ์์ผ๋ฉฐ ํผ๋ ์ค๋ฌ์ธ ์ ์์ต๋๋ค.