Typescript: рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдЕрдЧре░ 2014  ┬╖  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 , рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ PageConfig config ) рдХрд╛ рдирд┐рд░реНрдпрд╛рдд:

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> ред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ (рдЬреИрд╕реЗ ./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.  
}

рдпрд╛ рдмрд╛рд░ рдХреЛ { рдХреЗ рдЦреБрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреНрд▓реЙрдЬ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЖрдпрд╛рдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреНрд▓реЙрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд░реЛрдХрддрд╛ рд╣реИред

рдпрд╣ # 2159 рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛? рдПрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ?

@jbondc рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрддрд╛ рддреЛ рдпрд╣ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ред рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЖрдЗрд╕реЛрдореЙрд░реНрдлрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрде рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ "рдирд╛рдорд╕реНрдерд╛рди" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЕрд░реЗ рд╡рд╛рд╣, рдпрд╣ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рд╕реНрд╡реАрдХреГрдд рд╣реИред @RyanCavanaugh , @DanielRosenwasser , @mhegazy рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рджреВрд╕рд░рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдЬрд▓реНрдж рд╣реА рд▓рд╛рдЧреВ рдХрд░реВрдБрдЧрд╛ред

рдореИрдВ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрджреЗрд╣ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗрддрд╛ рд╣реВрдВ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдиреЗ рд╡рд╛рд▓реА рдирдИ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдпрд╛ред

рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк, рдХреГрдкрдпрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдмреНрд▓реЙрдХ рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдПрдЧреНрд░реАрдЧреЗрдЯ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ - рдиреЗрдорд╕реНрдкреЗрд╕ / рдореЙрдбреНрдпреВрд▓ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рдлреИрд▓рд╛рдирд╛ рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреИрд░-рддреБрдЪреНрдЫ рдШрдЯрдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдиреЗ рдкреВрд░реЗ рдирд╛рдорд╕реНрдерд╛рди / рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ?

@ рд╣рд╛рдереА-рд╡реЗрд╕рд▓ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдореЙрдбреНрдпреВрд▓, рдпрд╛ рдирд╛рдорд╕реНрдерд╛рди, рдпрд╛ рдкреИрдХреЗрдЬ, рдпрд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ, рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

@aluanhaddad рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдЖрдкрдХрд╛?

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрд╕ рд╕рдордп рдпрд╣ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рд╣реБрдИ рдереА рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЖрдЬ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдУрдкреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдм рдиреЗрдорд╕реНрдкреЗрд╕ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдиреЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдФрд░ рдЕрд╕рдВрдЧрдд рдЕрд░реНрде рд▓рд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реА рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдирд╛рдорд╕реНрдерд╛рди рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рдирд╛рдо рд╕реНрдерд╛рди рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рдХрд┐ рдвреАрд▓реА рдирд╣реАрдВ рдЯреВрдЯреА :) рдпрд╛ рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рддреЛ рд╢рд╛рдпрдж рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рд╢рдмреНрдж 'рдореЙрдбреНрдпреВрд▓' рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдХрд╛рдИ рдХрд╛ рд╡рд░реНрдгрди рд╣реЛрддрд╛ рд╣реИред рдЙрдк-рдШрдЯрдХреЛрдВ, рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА 'рдиреЗрдорд╕реНрдкреЗрд╕' рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдЗрд╕рд▓рд┐рдП рдореИрдВ [_generic рдореЙрдбреНрдпреВрд▓_] рдкрд░ рдЙрди рдмрд╛рдзрд╛рдУрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдЕрдиреНрдп [_generic рдореЙрдбреНрдпреВрд▓_] рдпрд╛ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╛рдорд╕реНрдерд╛рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реА рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдХрдХреНрд╖рд╛рдПрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рд╡реЗ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдкрд░рдорд╛рдгреБ рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдВрдЧрдардирд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рди рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ ред рдпрд╣ рдЕрднреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рд╣реИред

рдореИрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЙрдЪреНрдЪ рдХреНрд░рдо рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рд╛рдл рддрд░реАрдХреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдХреЛрдИ рдЙрдкрджреНрд░рд╡ рдирд╣реАрдВред рдЕрдзрд┐рдорд╛рдирддрдГ рдПрдХрдорд╛рддреНрд░ рдЙрдкрджреНрд░рд╡ рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ рджрд┐рд╢рд╛рддреНрдордХ рджреГрд╢реНрдпрддрд╛ рдХреА рдХрдореАред рдЬреИрд╕реЗ рдХрд┐ _MySystem.ClientApplication_ рдХреЛ _MySystem.Infrastructure_ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдареАрдХ рдХрд░рдирд╛ред рддрдм рд╣рдо рдХрд╣реАрдВ рд░реЛрдорд╛рдВрдЪрдХ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред

@ рд╣рд╛рдереА-рдкреЛрдд рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрддреНрдпрдВрдд рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣рд╛рдВ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рд╕рд┐рд░ рдкрд░ рдХреАрд▓ рдорд╛рд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдорд╕реНрдерд╛рди рдЙрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрддрд░ рдкрд░ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХрд▓ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ _imply_ рдПрдХрд╛рдзрд┐рдХ рдЗрдВрд╕реНрдЯреЗрдВрдЯрд┐рдПрд╢рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ @ рд╣рд╛рдереА-рд╡реЗрд╕рд▓ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЕрдиреНрдп рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЧрд▓рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рд╕рднреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рд╡рд░реНрдЧ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреАрдПрд╕ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ "рдЖрдХреГрддрд┐" рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ рдФрд░ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХрдВрдЯреНрд░реЛрд╡рд░реНрд╕реАрдЬрд╝ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЕрдбрд╝рдЪрди рдбрд╛рд▓рдиреЗ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдкреИрдЯрд░реНрди рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдХреБрдЫ "рдЖрдХрд╛рд░" (рдпрд╛рдиреА рдмрд╛рдзрд╛рдУрдВ) рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЪрд▓ рд░рд╣реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВред рдЕрдм, рдпрд╣ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ / рдЪреЗрдХ рдХрд┐рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдХрдХреНрд╖рд╛ рдЖрдзрд╛рд░рд┐рдд DI (рд▓рд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рд╣реИ (рдФрд░ рдЗрд╕рд▓рд┐рдП рддрддреНрдХрд╛рд▓)ред

рд╡реИрд╕реЗ рднреА, рдореИрдВ @ рдПрд▓рд┐рдлреЗрдВрдЯ-рд╡реЗрд╕рд▓ рдХреЛ рдкреИрд░рд╛рдлрд╝реНрд░рд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЗрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдкрдХреНрд╖реА рдкрд░ рдХреЛрдИ рд╢рдмреНрдж? рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдореБрджреНрджрд╛ рднреА рд╣реИ

soooo, рдЙрд╣, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛:

export {} as IFooBar;

рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╣рд▓реЗ рд╣реА рд╕реНрд╡реАрдХреГрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд╢рд╛рдпрдж

export implements IFooBar

рд╡реИрд╕реЗ рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВ

рдХреНрдпрд╛ рдпрд╣ рдореИрдЯреНрд░рд┐рдХреБрд▓реЗрдЯреЗрдб / рд▓реИрдВрдб рд╣реБрдЖ рд╣реИ? рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдлреАрдЪрд░ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢!

рдЗрд╕ рдмрд┐рд░реНрдм рдкрд░ рдХреЛрдИ рдХреАрдбрд╝рд╛? рдлрд┐рд▓рд╣рд╛рд▓ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

export default {}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ рдмрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ:

const x: MyInterface = {}
export default x;

рдпрд╣ рд╕рдмрд╕реЗ TS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ, рдХрд┐ рдпрджрд┐ рдЖрдк JS рдХреЗ рд▓рд┐рдП рдХреЛрдбрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ TS рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдмрд╛рдд рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдРрд╕реЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ? рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

export namespace Foo implements Bar {

}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд░ рдПрдХ _abameter_ рдирд╛рдорд╕реНрдерд╛рди lol idk рд╣реЛрдЧрд╛

рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╡рд╛рд▓ рдХрдИ рдмрд╛рд░ рдЙрдарддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдм рд╕рд┐рд░реНрдл рдПрдХ рдЪреАрдЬ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВ:
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВред
рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╣рд╛рдБ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ рд╢рд╢рд┐рдкреЗрдЯрд▓ рдирд╛рд╣рдВ рдРрд╕рд╛ред

рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

export default <T>{
  foo: Foo,
  bar: Bar
}

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ:

export const foo : Foo = {};
export const bar : Bar = {};

рд▓реЗрдХрд┐рди рдлреВ рдФрд░ рдмрд╛рд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рд╕рд╣реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╕рдорд░реНрдерд┐рдд рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕, рдЖрдк рд╕реНрдерд┐рд░ рдлреВ / рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдирд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ILoveFooBar {
рд╕реНрдерд┐рд░ рдлреВ: FooType;
рд╕реНрдЯреИрдЯрд┐рдХ рдмрд╛рд░: рдмрд╛рд░ рдЯрд╛рдЗрдк;
}

рд╕рд╣реА?
рдпрд╣реА рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛- рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред

@shaipetel рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдп рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЗ рдЬрд╛рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ?

рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЪреМрдЦрдЯреЗ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрди рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реЛрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Next.js рдЖрдкрдХреЗ рдлрд╝рд╛рдЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП ./pages/**/*.{ts,tsx} рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рд╕рд╣реА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рдореЗрдВ NextPage , рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ PageConfig config ) рдХрд╛ рдирд┐рд░реНрдпрд╛рдд:

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> ред

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ (рдЬреИрд╕реЗ ./pages/**/*.{ts,tsx} ) рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрдпрд╛рдд рдЖрдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ- рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ pages рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рд╣реИ, рдФрд░ рдпрд╣ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рддрд╛ рд╣реВрдВ рдЬрдм рдПрдХ рд╕рд░рд▓ рдореЙрдбреНрдпреВрд▓ рдЬреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рдХреИрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдпрд╣ рдкрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?

@RyanCavanaugh @DanielRosenwasser
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ?

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

рд╕реНрдЯреЛрд░реАрдмреБрдХ v6 рд╕рдВрд░рдЪрд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдШрдЯрдХ рдХрд╣рд╛рдиреА рдкреНрд░рд╛рд░реВрдк рдХрд╣рд╛ рд╣реИред рдПрдХ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рднреА .stories.js/ts рдореЙрдбреНрдпреВрд▓ Meta рд╕рд╛рде рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдЯрд╛рдЗрдк рдореМрдЬреВрджрд╛ рдХрдореА рдХреЗ рд╕рд╛рде, рдЯрд╛рдЗрдкрдмреБрдХ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реАрдмреБрдХ v6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЪрд┐рдХрдиреА рдЕрдиреБрднрд╡ рд╣реЛрддрд╛ рд╣реИред

@Jonrimmer рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ default рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд type рдЬреЛ module рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреЗрдбрд╝-рдЭрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред

рд╡реЗрдмрдкреИрдХ рдХреЛ import * as Foo рд╣рд┐рд▓рддреЗ рд╣реБрдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рд╕рднреА рд╕реНрдерд┐рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде export default const = {} рдпрд╛ export default class ModuleName { рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдЖрдпрд╛рдд рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕