рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдПрдХ рдореЙрдбреНрдпреВрд▓ 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.
}
рдпрд╛ рдмрд╛рд░ рдХреЛ {
рдХреЗ рдЦреБрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреНрд▓реЙрдЬ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдЖрдпрд╛рдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреНрд▓реЙрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рджреГрд╢реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд░реЛрдХрддрд╛ рд╣реИред
рдпрд╣ # 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 {
рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдЖрдпрд╛рдд рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдПрдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЪреМрдЦрдЯреЗ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрди рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реЛрддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Next.js рдЖрдкрдХреЗ рдлрд╝рд╛рдЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП
./pages/**/*.{ts,tsx}
рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдлрд╝рд╛рдЗрд▓рдирд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рд╕рд╣реА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рдореЗрдВNextPage
, рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХPageConfig
config
) рдХрд╛ рдирд┐рд░реНрдпрд╛рдд:рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд┐рд░реНрдпрд╛рдд рдЖрдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ
implements NextPageModule<Props>
редрдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдпрджрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдерд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ (рдЬреИрд╕реЗ
./pages/**/*.{ts,tsx}
) рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрдпрд╛рдд рдЖрдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ- рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣pages
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд┐рд╕рд╛рд▓ рд╣реИ, рдФрд░ рдпрд╣ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред