Typescript: ๋ชจ๋“ˆ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ—ˆ์šฉ

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

๋ชจ๋“ˆ์ด 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);
Suggestion help wanted

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

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

์˜ˆ๋ฅผ ๋“ค์–ด 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 ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ „ํžˆ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•œ ์„ ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๋‚ด๋ถ€ ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ๋˜๋ฉด ์™ธ๋ถ€ ์šฉ์œผ๋กœ๋„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ์ข‹์€ ์งˆ๋ฌธ์ด์•ผ. ์–ด๋–ค ๊ตฌ๋ฌธ์ด ๊ฐ€์žฅ ์ข‹์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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 { ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ ํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ ์˜ค๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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