Typescript: рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рд╣реЛрдиреЗ рджреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдирд╡ре░ 2014  ┬╖  140рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдорда рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдореИрдВ рд▓реЗрдЦрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ

interface Monad<T<~>> {
  map<A, B>(f: (a: A) => B): T<A> => T<B>;
  lift<A>(a: A): T<A>;
  join<A>(tta: T<T<A>>): T<A>;
}

рдЗрд╕реА рддрд░рд╣, рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдлрдВрдХреНрд╢рдВрд╕ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдореИрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ

interface Cartesian<T<~>> {
  all<A>(a: Array<T<A>>): T<Array<A>>;
}

рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:

interface Foo<T<~,~>> {
  bar<A, B>(f: (a: A) => B): T<A, B>;
}

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

рдЬреИрд╕рд╛ рдЕрднреА рдорд╛рдорд▓рд╛ рд╣реИ, рдРрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднрд░рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

class ArrayMonad<A> implements Monad<Array> {
  map<A, B>(f: (a:A) => B): Array<A> => Array<B> {
    return (arr: Array<A>) =>  arr.map(f);
  }
  lift<A>(a: A): Array<A> { return [a]; }
  join<A>(tta: Array<Array<A>>): Array<A> {
    return tta.reduce((prev, cur) => prev.concat(cur));
  }
}

рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдкрд░рд╛рдЗрдлрд╝ рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ (рджреЗрдЦреЗрдВ рдЕрдВрдХ 308 ):

typedef Maybe<Array<~>> Composite<~> ;
class Foo implements Monad<Composite<~>> { ... }

рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЙрдкрдирд╛рдореЛрдВ рдХреА рд╕рдорд╛рдирддрд╛рдПрдВ рдЯрд╛рдЗрдкрд┐рдбрд┐рдл рдХреЗ рд╡реИрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Suggestion help wanted

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЗрдВ, рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рдмрд╛рдд рд╕реБрдиреЗрдВ, рдЬреЛ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдШреЛрдбрд╝реЗ рдХреА рдорд╛рдБрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдл * рдЬреА рдлреЗрд░рд╛рд░реА рджреЗрдВ

рд╕рднреА 140 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХрд┐рд╕реА рднреА рджрд╛рдиреЗ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╢рд╛рдпрдж рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ

map<A, B>(f: (x: A) => B): T<A> => T<B>;

рдЬрдмрдХрд┐ рдЕрднреА рдХрд╛ рдирдХреНрд╢рд╛ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ any (рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо A ) рд╣реИ, рд╕реЗ B рдПрдХ рдореИрдкрд░ рд▓реЗрддрд╛ рд╣реИред

рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП --noImplicitAny рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж, рд╕рд╣реА рдХрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рд╣реИред

: +1: рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдмреЛрдирд╕ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЙрдЪреНрдЪ рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛: p

рдЕрд░реНрдз рдордВрдЬреВрд░реА рджреЗ рджреАред

рд╣рдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдирдореВрдирд╛ рдкреАрдЖрд░ рд╣реЛрдиреЗ рд╕реЗ рдЬреЛ рдХрдо рд╕реЗ рдХрдо 80% рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реЛрдЧрд╛ред

рдЯрд┐рд▓реНрдбреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреА рд░рд╛рдп рдХреНрдпрд╛ рд╣реИ? T~2 рд╡рд┐рдХрд▓реНрдк рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛

interface Foo<T<~,~>> {
  bar<A, B>(f: (a: A) => B): T<A, B>;
}

рдЙрдкрдирд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЬреЗрдирд░рд┐рдХ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

interface Foo<T<~,~,~>, U<~>, V<~, ~>> {
  bar<A, B, C, D>(a: A, f: (b: B) => C, d: D): T<U<A>, V<B, C>, D>;
}

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣реАрдВ рдФрд░ рднреА рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ

interface Foo<T<~,~>> {
  bar<A, B>(f: (a: A) => B): T<A, B>;
}

рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ * рдмрдЬрд╛рдп рд╕рдорд╛рди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ ~ :

interface Foo<T<*,*>> {
  bar<A, B>(f: (a: A) => B): T<A, B>;
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдЪрд░рдо рдкрд░ рд▓реЗ рдЬрд╛рдирд╛, рдЖрдкрдХреЛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ:

interface Foo<T: (*,*) => *> {
  bar<A, B>(f: (a: A) => B): T<A, B>;
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ T<~,~> T~2 рднреА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо ~ рдпрд╛ * ; рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЬреЗрдПрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо _ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ => рдЕрдВрдХрди рдХреНрдпрд╛ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ; рд╕рднреА рдЬреЗрдирд░рд┐рдХ рдХреБрдЫ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХрд▓ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдПрдХ рд╣рд▓реНрдХрд╛-рд╡рдЬрди рд╡рд╛рд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреА рдЖреЗрд░ рд╕реЗ рд╣рдЯ рдЬрд╛рдПрдЧрд╛; рдкрд╛рд░реНрд╕рд░ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдпрджрд┐ рдмрд╛рдХреА рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рдереЗ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВрдЧреЗред

рдореБрдЭреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред Transpiler рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрд╡реЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдлреЛрд░рдо рдХреНрдпрд╛ рд╣реИ?

рдЕрдзрд┐рдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХреЛрдб рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрдИ рдирдП рдореБрджреНрджреЛрдВ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдк рдпрд╣рд╛рдВ рдЪреИрдЯ рд░реВрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ https://gitter.im/Microsoft/TypeScript рдФрд░ рд╣рдо рд╡рд╣рд╛рдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@metaweta рдХреЛрдИ рдЦрдмрд░? рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕рд╣рд╛рдпрддрд╛ / рдЪрд░реНрдЪрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдордВрдерди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдирд╣реАрдВ, рдХрд╛рдо рдХреА рдЪреАрдЬреЛрдВ рдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЦрд╛рд▓реА рд╕рдордп рджрд┐рдпрд╛ред

рдЯрдХреНрдХрд░: рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрднреА рджреЗрдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реИ?

https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -96854288 рдЕрднреА рднреА рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд╛рд░ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдлреИрдХреНрдЯреНрд░рд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ Promise рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдирд┐рд░реНрдорд╛рддрд╛) рд▓реЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧ-рдпреЛрдЧреНрдп рд╡рд╛рджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕:

interface Database<P<~> extends PromiseLike<~>> {   
    query<T>(s:string, args:any[]): P<T> 
}

рдпрд╣рд╛рдБ рднреА рдХрд╛рдо рдЖрдПрдЧрд╛ http://stackoverflow.com/questions/36900619/how-do-i-express-this-in-typescript

: +1:

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

рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЗрдВ, рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рдмрд╛рдд рд╕реБрдиреЗрдВ, рдЬреЛ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдШреЛрдбрд╝реЗ рдХреА рдорд╛рдБрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдл * рдЬреА рдлреЗрд░рд╛рд░реА рджреЗрдВ

рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ 15 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдпреВрдк, рдХреЛ рдЯрдХреНрдХрд░ рджреАред рдореИрдВ рдЯреАрдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрдм рддрдХ рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рдХреИрдиреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ?

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ # 7848 рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛? рд╡реЗ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреНрдп рдкрд╣рд▓реВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

@ рдмреЛрд░рд┐рд╕-рдорд╛рд░рд┐рдиреЛрд╡ рд░реЗрдпрд╛рди рдХреИрд╡рд╛рдиреБрдЖрдШ

рдПрдХ рдирдореВрдирд╛ рдкреАрдЖрд░ рд╣реЛрдиреЗ рд╕реЗ рдЬреЛ рдХрдо рд╕реЗ рдХрдо 80% рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЧрд▓рд╛ рдХрджрдо рд╣реЛрдЧрд╛ред

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

@Artazor рдХреНрдпрд╛ рдЖрдк # 7848 рдкрд░ рднреА

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд┐рд▓реНрдХреБрд▓ рдЕрджреНрднреБрдд рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдЗрд╕реЗ рдПрдХ рдирдП рд╕реНрддрд░ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпрд╛ рдУрдкреА рдореЗрдВ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ? рд▓рд╛рдЗрди рдореЗрдВ A

class ArrayMonad<A> implements Monad<Array> {

рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп A ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ map рд╕рд╛рде рдлрдВрдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ this рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛? рдЗрд╕ рддрд░рд╣ рд╢рд╛рдпрдж?

interface Functor<T, A> {
  map<B>(f: (a: A) => B): T<A> => T<B>;
}

class Maybe<A> implements Functor<Maybe, A> {
  ...
}

@ рдкрд╛рд▓реНрдбреЗрдкрд┐рдВрдб # 7848 рджреЗрдЦреЗрдВред рдпрд╣ рдЪрд░реНрдЪрд╛ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ IMHO рдпрд╣ рдФрд░ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдкреАрдЖрд░ рдореЗрдВ рд╡рд┐рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рд╛рдорд╛рди рдХрдм рдЙрддрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ? рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдЬрд░реВрд░реА рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:

interface SomeX<X, T> {
   ...// some complex definition
  some: X<T>
}

interface SomeA<T> extends SomeX<A, T> {
}

?

@whitecolor рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рддрд▓рдирд╛, рдЬреЛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдбрд╝рд╛ рдордЫрд▓реА рд╣реИ:

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.0 рдЖрд░рд╕реА рдХреЗрд╡рд▓ 2 рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧреЗрдЧрд╛ред
  2. bind , call , рдФрд░ apply , рдореВрд▓ JS рдлрд╝рдВрдХреНрд╢рди, рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реИрд░реЗрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред Object.assign рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рдлрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдХреЗрд▓реЗ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
  3. рд▓реЙрдбрд╢ рдХреЗ _.pluck , рдмреИрдХрдмреЛрди рдореЙрдбрд▓ ' get рдФрд░ set рд╡рд┐рдзрд┐рдпреЛрдВ рдЖрджрд┐ рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдирдЫреБрдП рд╣реИрдВ , рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдмреИрдХрдмреЛрди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рднреА

рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП (рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП _love_), рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред

@isiahmeadows
рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕реВрдЪреА рдореЗрдВ рд╣рд╛рдБ 3 рдЖрдЗрдЯрдо рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, https://github.com/Microsoft/TypeScript/issues/1295 рдХрд╛ рднреА рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдХрд┐рд╕реА рддрд░рд╣ 2.1 рджреЗрд╡ рдореЗрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрдВрджрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

(рд░реИрдВрдХ 2 рдмрд╣реБрд░реВрдкрддрд╛, рдЬреЛ рдпрд╣ рдореБрджреНрджрд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдХрд╛рд▓реНрдкрдирд┐рдХ рд▓реИрдВрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЙрд╕ рдХрд▓реНрдкрдирд╛ рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди ADTs рдХреЛ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд░рд╛рдорд╛рдбрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕рдХреА рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред)

Tue рдкрд░, 6 рд╕рд┐рддрдВрдмрд░, 2016, 11:00 рдПрд▓реЗрдХреНрд╕ рд╕реВрдЪрдирд╛рдПрдВ @

@isiahmeadows https://github.com/isiahmeadows
рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рдБ рд╕реВрдЪреА рдореЗрдВ 3 рдЖрдЗрдЯрдо рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ,
# 1295 https://github.com/Microsoft/TypeScript/issues/1295 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ
рднреАред

рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдХрд┐рд╕реА рддрд░рд╣ 2.1 рджреЗрд╡ рдореЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -244978475,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AERrBMvxBALBe0aaLOp03vEvEyokvxpyks5qnX_8gaJpZM4C99VY
ред

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реВрдкреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рд╣реИ:

interface Model {
  field1: string,
  field2: number,
  field3?: Model
}

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

interface Handler<T> {
  readonly value: T;
  onChange: (newValue: T) => void;
}

рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░рд╛ рдПрдХ рдлрдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд▓реНрдпреВ рдХреЗ рдмрдЬрд╛рдп рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде:

function makeForm(value: Model): {
  field1: Handler<string>,
  field2: Handler<number>,
  field3: Handler<Model>,
}

рдЕрднреА рддрдХ рдореИрдВ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ TS рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЧрд╛рдп рдореИрдВ HKT рдХреЗ рд╕рд╛рде makeForm рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рд╣рдореНрдо, рджрд┐рд▓рдЪрд╕реНрдкред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

//Just a container
interface Id <A> {
  value: A
}

interface Model <T> {
  field1: T<string>,
  field2: T<number>,
  field3?: T<Model>
}

makeForm (Model<Id>): Model<Handler>

@ рдмреЛрд░рд┐рд╕-рдорд╛рд░рд┐рдиреЛрд╡ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдпрд╣ рд░реЗрдЦрд╛ рд╣реИ:

interface Model<T> {
  //...
  field3?: T<Model> // <- Model itself is generic.
                    // Normally typescript will error here, requiring generic type parameter.
}

рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдПрдЪрдХреЗрдЯреА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдкреНрд░рдХрд╛рд░ (https://github.com/Microsoft/TypeScript/issues/4889#issuecomment-247721155) рдХрд╛ рдЙрддреНрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

type MyDataProto<K<~>> = {
    one: K<number>;
    another: K<string>;
    yetAnother: K<boolean>;
}
type Identical<a> = a;
type Optional<a> = a?; // or should i say: a | undefined;
type GettableAndSettable<a> = { get(): a; set(value: a): void }

type MyData = MyDataProto<Identical>; // the basic type itself
type MyDataPartial = MyDataProto<Optional>; // "partial" type or whatever you call it
type MyDataProxy = MyDataProto<GettableAndSettable>; // a proxy type over MyData
// ... etc

рдХрд╛рдлреА рдирд╣реАрдВред {x: number?} рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рдирд╣реАрдВ рд╣реИ {x?: number} , рдХреНрдпреЛрдВрдХрд┐ рдПрдХ
рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИред

Tue рдкрд░, рдЕрдХреНрдЯреВрдмрд░ 11, 2016, 09:16 рдЕрд▓реЗрдХреНрд╕реА рдмрдпрдХреЛрд╡ рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдПрдЪрдХреЗрдЯреА рддрдерд╛рдХрдерд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЙрддреНрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЖрдВрд╢рд┐рдХ рдкреНрд░рдХрд╛рд░ (# 4889 (рдЯрд┐рдкреНрдкрдгреА)
https://github.com/Microsoft/TypeScript/issues/4889#issuecomment-247721155
):

MyDataProto рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдПрдХ: рдХреЗ;
рджреВрд╕рд░рд╛: рдХреЗ;
рдЕрднреА рддрдХ: рдХрд╢реНрдореАрд░;
} type Identical = a; type рд╡реИрдХрд▓реНрдкрд┐рдХ = a ;;
= {get (): a;

;
;
;

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -252913109,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AERrBNFYFfiW01MT99xv7UE2skQ3qiPMks5qy4wRgaJpZM4C99VY
ред

@isiahmeadows рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдлрд┐рд▓рд╣рд╛рд▓ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ / рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдПрдХ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ

рдлрд┐рд░ рднреА рдПрдХ рдФрд░: рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕рдВрдкрддреНрддрд┐ readonly рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдлреАрдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдмрд╕ рдЗрд╕реЗ рд╡рд╣рд╛рдБ рдлреЗрдВрдХ ... рдореИрдВ * рд╕рд┐рдВрдЯреИрдХреНрд╕ ~ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБред ~ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрд╕ рдПрдХ рдХреАрдмреЛрд░реНрдб рд▓реЗрдЖрдЙрдЯ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд┐рдХреНрд╕ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдПрдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде * рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрдардиреАрдп / рдЕрд▓рдЧ рд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧ рддреБрд░рдВрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдПрдЪрдХреЗрдЯреА рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ * рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ,
рдФрд░ рджреВрд╕рд░рд╛, рдпрд╣ "рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп" рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред


рдЗрд╕рд┐рдпрд╛рд╣ рдореАрдбреЛрдЬ
[email protected]

рд╕реВрд░реНрдп рдкрд░, 6 рдирд╡рдВрдмрд░ 2016 рдХреЛ 12:10 рдкреВрд░реНрд╡рд╛рд╣реНрди, рд▓реИрдВрдбрди рдкреЛрдЪ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдмрд╕ рдЗрд╕реЗ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдирд╛ ... рдореИрдВ ~ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ * рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБред
~ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреАрдмреЛрд░реНрдб рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ
рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдпред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ * рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ
рд╕рднреА рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдкрдардиреАрдп / рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ рдЬреЛ рдорд┐рд╢реНрд░рдг рдореЗрдВ рд╣реИрдВред
рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдЬреИрд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧ
рддреБрд░рдВрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдПрдЪрдХреЗрдЯреА рд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░реЗрдВред рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -258659277,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AERrBHQ4SYeIiptB8lhxEAJGOYaxwCkiks5q7VMvgaJpZM4C99VY
ред

рдореАрд▓ рдХрд╛ рдкрддреНрдерд░: community ? рдЗрд╕ рдореБрджреНрджреЗ / рд╕реБрд╡рд┐рдзрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?

@whitecolor рд╕реНрдерд┐рддрд┐ DIY рд╣реИ (рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВ)

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ Accepting PRs рд▓реЗрдмрд▓ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП https://github.com/Microsoft/TypeScript/wiki/FAQ#what -do-the-label-on-these-issues-mean рджреЗрдЦреЗрдВред

рдХреГрдкрдпрд╛ https://github.com/Microsoft/TypeScript/issues/1213#issuecomment -96854348 рднреА рджреЗрдЦреЗрдВ

рдареАрдХ рд╣реИ, рдореИрдВ рд▓реЗрдмрд▓ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдмрд╕ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЧреИрд░-рдЯреАрдПрд╕ рдЯреАрдо рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

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

@Artazor рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рднрд╛рдЧреНрдп рд╣реИ?

@raveclassic - рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЧрдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдирд┐рдпрдо / рдЪрд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдЙрддрдиреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рддрдирд╛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ -)

рдореЗрд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ -)

рдмрд╕ рдПрдХ рдкреНрд░рдЧрддрд┐ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ, рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд░реНрдЧред рдореИрдВрдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ higherShape рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде TypeParameterDeclaration рдХреЛ рд╕рдореГрджреНрдз рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ

    export interface TypeParameterDeclaration extends Declaration {
        kind: SyntaxKind.TypeParameter;
        name: Identifier;
        higherShape?: HigherShape // For Higher-Kinded Types <--- this one 
        constraint?: TypeNode;

        // For error recovery purposes.
        expression?: Expression;
    }

рдФрд░ рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ HigherShape рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдбреЛрдореЗрди рдХреЗ рд▓рд┐рдП 1. рд╕рд░рд▓ рдпреЛрдЧреНрдпрддрд╛

type HigherShape = number

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:

class Demo<Wrap<*>, WrapTwo<*,*>> {   // 1 and 2
    str: Wrap<string>;
    num: Wrap<number>;
    both: WrapTwo<number, string>;
}

рдЗрд╕ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ number рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдлрд┐рд░ рднреА, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдЪреНрдЪрддрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: Demo рд╡рд░реНрдЧ рдХрд╛ рдЙрдЪреНрдЪ рдЖрдХрд╛рд░ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ 2 рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ,
рдФрд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛

var x: Demo<Array, Demo>

рдФрд░ рдлрд┐рд░ рд╕рдВрдкрддреНрддрд┐ .both рд╕рд╛рде рдЖрд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ number рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ (рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ);

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдк Demo рдореЗрдВ рдирд┐рдореНрди рдЙрдЪреНрдЪ рдХреНрд░рдо рдЖрдХрд╛рд░ рд╣реИ:

(* => *, (*,*) => *) => *

2. рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдбреЛрдореЗрди рдФрд░ рд╕рд╣-рдбреЛрдореЗрди

рддрдм рдореИрдВрдиреЗ рдЙрдЪреНрдЪ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдмрд╕реЗ рдкреВрд░реНрдг рдирд┐рд░реВрдкрдг рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реНрд╡реЛрдХреНрдд рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░:

(* => (*,*)) => ((*,*) => *)

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

3. рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЛрдореЗрди / рдЗрдореНрдкреНрд▓рд┐рдХреНрдЯ рд╕рд┐рдВрдкрд▓ рдХреЛ-рдбреЛрдореЗрди

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ - рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде) рд╣рдореЗрд╢рд╛ рдПрдХ рдЬрдореАрдиреА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдорд┐рдд рд╣реЛрддреА рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЙрд╕реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╣ рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдерд╛ рдХрд┐ рдореИрдВ рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

type HigherShape = NodeArray<TypeParameterDeclaration>;

рдЙрджрд╛рд╣рд░рдг:

class A {x: number}
class A2 extends A { y: number }
class Z<T> { z: T; }

class SomeClass<T1<M extends A> extends Z<M>, T2<*,*<*>>, T3<* extends string>> {
        var a: T1<A2>; // checked early
        var b: T2<string, T1>; // second argument of T2 should be generic with one type parameter  
        var c: T3<"A"|"B">; // not very clever but it is checked
        // ...
        test() {
             this.a.z.y = 123 // OK
             // nothing meaningful can be done with this.b and this.c
        }
}

рдпрд╣рд╛рдВ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрд┐ M T1<M extends A> extends Z<M> рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╣реИ рдФрд░ T1 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрд╣рд░реЗ рджреГрд╢реНрдпрдорд╛рди рджрд╛рдпрд░реЗ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ M SomeClass рдмреЙрдбреА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
рдФрд░ * рдорддрд▓рдм рдмрд╕ рдПрдХ рддрд╛рдЬрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЧреБрдордирд╛рдо рдкреНрд░рдХрд╛рд░) рд╣реИ рдЬреЛ рдХрднреА рднреА рдХрд┐рд╕реА рдЪреАрдЬ рд╕реЗ рдирд╣реАрдВ рдЯрдХрд░рд╛рддрд╛ (рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)


рдЗрд╕ рдкреНрд░рдХрд╛рд░ TypeParameterDeclaration рдХрд╛ рдЕрдВрддрд┐рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░

    export interface TypeParameterDeclaration extends Declaration {
        kind: SyntaxKind.TypeParameter;
        name: Identifier;
        typeParameters?: NodeArray<TypeParameterDeclaration> // !!! 
        constraint?: TypeNode;

        // For error recovery purposes.
        expression?: Expression;
    }

@DanielRosenwasser , @ aleksey-bykov, @isiahmeadows рдФрд░ рдЕрдиреНрдп рдХреА рдХреЛрдИ рд░рд╛рдп рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ -)

рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛрдб рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирддрд╛ рд╣реВрдВред

рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╛рдирд╛ рдмрдЬрд╛рдиреЗрд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЖрд╡рд╛рдЬ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдкрд░, Artazor рдЬрдпрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! :)

Redux рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред

@michaeltontchev рдЖрдк Redux рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореБрджреНрджреЗ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ?

рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ https://github.com/bcherny/tdux рдФрд░ https://github.com/bcherny/typed-rx-emitter рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП, рдЬреЛ Redux рдФрд░ EventEmitter рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред

рдЕрдм рд▓рдЧрддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде @rbuckton рд╢рд╛рдЦрд╛ # 13487 рдХреЛ

@bcherny - рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЙрдирдХреА рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛!

рдореИрдВ рдпрд╣ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд░рд┐рдбреНрдпреВрд╕рд░ (рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд╕рд╛рде) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдХреЗ CombReducers рдХреЛ рдХреИрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдиреЗрд╕реНрдЯреЗрдб рдЬреЗрдирд░рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:

import { combineReducers, Reducer } from 'redux';

interface IState {
    // my global state definition
}

type StatePropertyNameAndTypeAwareReducer\<S> = {
    [P in keyof S]: Reducer<S[P]>;
};

let statePropertyToReducerMap : StatePropertyNameAndTypeAwareReducer<IState> = {
    navBarSelection: navBarReducer,
};

let combinedReducers = combineReducers<IState>(statePropertyToReducerMap);

рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдКрдкрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧрдардмрдВрдзрди рдХрд┐рдП рдЧрдП рд░реЗрдбреНрдпреВрд╕рд░ рдореИрдкрд┐рдВрдЧ рдЖрдкрдХреЗ рд░рд╛рдЬреНрдп рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдЪрд┐рдд рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдСрдирд▓рд╛рдЗрди рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ - рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХреАрдл рдлреАрдЪрд░ рдХреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рджреЛ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдерд╛ :)

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЗрд╕реНрдЯреЗрдб рдЬреЗрдиреЗрд░рд┐рдХреЛрдВ рдиреЗ рдореБрдЭреЗ StatePropertyNameAndTypeAwareReducer рдкреНрд░рдХрд╛рд░ рдореЗрдВ Reducer рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рдЬреЗрдиреЗрд░рд┐рдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрд╖рдгред

Edit2: рдпрд╣рд╛рдВ Redux рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛: https://github.com/reactjs/redux/issues/2238 рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ рдмрд╣реБрдд рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдЧреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ Redux рдХреЛ рд╡рдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирддреЗ рд╣реИрдВред

рд╕рдВрдмрдВрдзрд┐рдд: https://github.com/Microsoft/TypeScript/issues/10571

рдХреИрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рд╢рд╛рдпрдж рдПрдХ рднреЛрд▓рд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрдЬрд╛рдп ~ рдпрд╛ * рдХреНрдпреЛрдВ? рдХреНрдпрд╛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИ? рдЕрд░реНрдерд╛рддред рдХреНрдпреЛрдВ рдирд╣реАрдВ:

type Functor<A<T>> = {
  map(f: (value: T) => U): A<U>
}

рдпрд╛:

kind Functor<A<T>> = {
  map(f: (value: T) => U): A<U>
}

рдпрд╛ рдФрд░ рднреА:

abstract type Functor<A<T>> = {
  map(f: (value: T) => U): A<U>
}

@bcherny рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Functor<A<T>> рдХрд╛ рдЕрд░реНрде рдкреВрд░реНрд╡ рдореЗрдВ " A T " рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдБ T рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЧреБрдВрдЬрд╛рдЗрд╢ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдХреБрдЫ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@masaeedu рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЕрд░реНрде рд╣реИ "рдореМрдЬреВрджрд╛ рджрд╛рдпрд░реЗ рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ" T рд╕рдЦреНрддреА рд╕реЗ "рдХреЗ рдмрдЬрд╛рдп" T рд▓реЗрдЬрд╝реАрд▓реА "рдмрд╛рдБрдзреЗрдВред

рдореИрдВрдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @DanielRosenwasser рдХреЗ T: * => * рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП "рдкреВрд░реНрд╡ рдХрд▓рд╛" рд╣реИред

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ -> рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░ рд╣реИ (рд╢рд╛рдпрдж Func<TArg, TRet> рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ)ред рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ -> рджреЛ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ T рдФрд░ U рдФрд░ рдПрдХ рд╡реИрд▓реНрдпреВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдпрд╛рдиреА рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ T рдорд╛рдиреЛрдВ рдХреЛ рдореИрдк рдХрд░рддрд╛ рд╣реИ U рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рднреА рдПрдХ рддрд░рд╣ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ! рджрдпрд╛рд▓реБ рдирд┐рд░реНрдорд╛рддрд╛ -> рджреЛ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ T* рдФрд░ U* (рджреГрд╢реНрдп рднреЗрдж рдХреЗ рд▓рд┐рдП рддрд╛рд░рд╛рдВрдХрди), рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ T* рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ U* ред

рдЖрдк рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдкреИрдЯрд░реНрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдмрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреНрд░рд╣реНрдорд╛рдВрдбреЛрдВ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред (рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ isomorphic рд╣реИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирдВрдд рд╕реНрддрд░реЛрдВ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдореВрд▓реНрдпреЛрдВ -> рдкреНрд░рдХрд╛рд░ -> рдкреНрд░рдХрд╛рд░ -> рдкреНрд░рдХрд╛рд░ -> ..., рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг * рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп)

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреИрдЯрд░реНрди рдЗрддрдирд╛ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЬреАрдПрдЪрд╕реАрдЖрдИ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рдЗрд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ -> ред рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ "рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ рдпрд╣ рд╡рд┐рд╖рдо рд╕реВрдЪреА ( [] рджреЛрдиреЛрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░), рд╡рд┐рд╖рдо рд▓рдВрдмрд╛рдИ, "рд╕реНрдорд╛рд░реНрдЯ рд▓рдВрдмрд╛рдИ" "рд╡реИрдХреНрдЯрд░, рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ред

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

рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо any рдмрдЬрд╛рдп * ; рдпрд╣ рд╣рд░ рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рднреНрд░рд╛рдордХ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдкреБрд╕реНрддрдХ рд╕реЗ рдПрдХ рдкреГрд╖реНрда рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ' рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдУрдкреА рдХрд╛ рдЙрджрд╛рд╣рд░рдг рддрдм рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛:

interface Monad<(T: 'any => 'any)> {
    // ...
}

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

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

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

рдпрд╣ рднреА рд╕реЛрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ; рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЬреЛ рдмрдВрдзреА рд╣реБрдИ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рдмрдЬрд╛рдп рддрджрд░реНрде рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, Monad T рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Constraint , рди рдХрд┐ * ред

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

рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐?

@Gcanti https://medium.com/@gcanti/higher -kinded-рдЯрд╛рдЗрдк-рдЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╕реНрдЯреИрдЯрд┐рдХ-рдПрдВрдб-рдлрд╝рдВрддрд╛рд╕реА-рднреВрдорд┐- d41c361d0dbe рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг

Fp-ts рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрдиреНрдпрдерд╛ рдкреНрд░рдорд╛рдгрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реЛрдЪреА рдЧрдИ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рди рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ ts рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ :)

~ рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рднреБрдЧрддрд╛рди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ / рд╕рдХреНрд╖рдо рд╣реИ? рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭрд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

@Gcanti https://medium.com/@gcanti/higher -kinded-рдЯрд╛рдЗрдк-рдЗрди-рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд╕реНрдЯреИрдЯрд┐рдХ-рдПрдВрдб-рдлрд╝рдВрддрд╛рд╕реА-рднреВрдорд┐- d41c361d0dbe рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд░рд┐рдгрд╛рдореА map рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ, рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Option рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ (HKT) рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ рджреЗ рд╕рдХреНрддрд╛:

function map<A, B>(f: (a: A) => B, fa: HKTOption<A>): Option<B> {
  return (fa as Option<A>).map(f)
}

26 рдЕрдЧрд╕реНрдд, 2016 рдХреЛ рдиреЛрдЯ рдХрд┐рдП рдЧрдП @spion рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдерд╛ ред

PS рдЕрдЧрд░ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдореЗрд░реЗ ( @keean рдХреЗ) рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓

@ shelby3 FWIW Option map ( Option.ts ) рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ Functor map Functor.ts ) рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рдПрдХ рд╕рд╛рдорд╛рдиреНрдп lift рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдлрд╝рдирдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреЗрдЦрдХрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ :)

рдореИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ :)

@ shelby3 : рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд╛рдВрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЙрдиреНрд╣реЗрдВ рдЯреАрдПрд╕ рд░реЛрдбрдореИрдк рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП; рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкреАрдЖрд░ рдереЗ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд┐рд▓рддреЗ рдереЗ
рдлреАрдбрдмреИрдХ / рдорд░реНрдЬ рдпрд╛ рддреЛ рдЫреЛрдЯреЗ рдлрд╝рд┐рдХреНрд╕реЗрд╕ рдпрд╛ рдпрджрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦ рд░рд╣реЗ рдереЗ
рдЙрдирдХреЗ рдЕрдВрджрд░ред рдореИрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЕрдЧрд░ рддреБрдо рд╣реЛ
рдЗрд╕рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

8 рдЬрдирд╡рд░реА, 2018 4:05 рдЕрдкрд░рд╛рд╣реНрди, "shelby3" рд╕реВрдЪрдирд╛рдПрдБ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рднреБрдЧрддрд╛рди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ / рд╕рдХреНрд╖рдо рд╣реИ? рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬрд╝рд╛рджреА рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ
рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ [email protected] рдпрд╛ рдХреЛрдИ рднреА рдХрд┐рд╕реА рдХреЛ рдХреЛрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ
рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рднреА рдмрддрд╛рдПрдВред

@Gcanti https://github.com/gcanti рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг
https://medium.com/@gcanti/higher -kinded-types- рдореЗрдВ-
рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд╕реНрдереИрддрд┐рдХ рдФрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ-рднреВрдорд┐ d41c361d0dbe

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд░рд┐рдгрд╛рдореА рдирдХреНрд╢реЗ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ
рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд▓реНрдк рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╣реИ
рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ (HKT) рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдлрдВрдХреНрд╢рди рдореИрдк (f: (a: A) => B, fa: HKTOption ): рд╡рд┐рдХрд▓реНрдк { рд╡рд╛рдкрд╕реА (рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ ) }

рдПрдЪрдХреЗрдЯреА рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░
рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдЯреНрд░рд╛рдЗрдЬреНрдб рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реЛрдирд╛ рд╣реИред рд╣рдо
рдЗрд╕ https://github.com/keean/zenscript/issues/10 рдХреА рдЦреЛрдЬ рдХреА
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ред

рдкреБрдирд╢реНрдЪ рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИ
(рд╕рд╣рд┐рдд @keean https://github.com/keean's ) рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдкрд░рд┐рджреГрд╢реНрдп
https://github.com/keean/zenscript/issues/35#issuecomment-355850515 рдореИрдВ
рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рд╕реЗ рдирд╣реАрдВ рд╣реИ
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / ECMAScript рдФрд░ рд╕рдорд░реНрдерди рдХрд╛ рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реЛрдирд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде
рд╡рд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/1213#issuecomment-355990644 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AC6uxYOZ0a8G86rUjxvDaO5qIWiq55-Fks5tIi7GgaJpZM4C99VY
ред

@gcaniti рдиреЗ рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧреА рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдмреЗрд╢рдХ, рдпрд╣ рдореЗрд░реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ (рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рд╣реИ) рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

Afaics, рдЖрдкрдХрд╛ рдЪрддреБрд░ "рд╣реИрдХ" рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ lift ), рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рди рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдлрд╝реИрдХреНрдЯрд░реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯрдВрдХрдг (рдЕрдкрдбреЗрдЯ) рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдСрдЧреНрдореЗрдВрдЯреЗрд╢рди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬреИрд╕реЗ Option ред рдХреНрдпрд╛ рдЬреЗрдиреЗрд░рд┐рдХ рдлреИрдХреНрдЯреНрд░реА рдХреЗ рд╣рд░ рдЬреЗрдиреЗрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬреИрд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ sort рдЙрджрд╛рд╣рд░рдг @keean рдФрд░ рдореИрдВрдиреЗ рдЪрд░реНрдЪрд╛ рдХреА? рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рднреА рдЦреЛрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдХреЛрдЯрд▓рд┐рди рдиреЗ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдирдХрд▓ рдХреА рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд? (рдЙрд╕ рд▓рд┐рдВрдХ рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд▓реЛрдЪрдирд╛рдПрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ)

рдореИрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред

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

рдиреЛрдЯ рдореИрдВ рдпрд╣ рднреА рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрд▓реЛрди рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ EMCAScript рд╕рдВрдХрд▓рди рд▓рдХреНрд╖реНрдп рдореЗрдВ рдЙрдирдХреЗ рдирд┐рд╡реЗрд╢ рдХрд╛ рд╕реНрддрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред (рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рдЕрдзреНрдпрдпрди рдХреА рдЬрд░реВрд░рдд рд╣реИ)ред

рдореИрдВ рднреА рд╕рд┐рд░реНрдл рдЗрд╕ рд╕реАрдорд╛ рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ I рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:


interface IdType<T> {
  id: T;
}

interface User {
  id: number;
  name: string;
}

function doStuff<T extends IdType<I>>() {
  const recs = new Map<I, T>();
  return {
    upsert(rec: T) {
      recs.set(rec.id, rec);
    },
    find(id: I) {
      return recs.get(id);
    },
  };
}

(function () {
  const stuff = doStuff<User>();
  stuff.upsert({id: 2, name: "greg"});
  console.log(stuff.find(2));
})();

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ doStuff<User, number>() ) рдЬреЛ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдорд╛рд░рд╛ рдЧрдпрд╛ рд╣реВрдБред

рдореИрдВ рд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ

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

рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЬрд▓реНрджреА рд╕реЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП P * -> * рдЬреИрд╕реЗ P<T> extends Promise<T> ред

рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

/**
* Returns a promise that waits for `this` to finish for an amount of time depending on the type of `deadline`.
* If `this` does not finish on time, `onTimeout` will be called. The returned promise will then behave like the promise returned by `onTimeout`.
* If `onTimeout` is not provided, the returned promise will reject with an Error.
*
* Note that any code already waiting on `this` to finish will still be waiting. The timeout only affects the returned promise.
* <strong i="14">@param</strong> deadline If a number, the time to wait in milliseconds. If a date, the date to wait for.
* <strong i="15">@param</strong> {() => Promise<*>} onTimeout Called to produce an alternative promise once `this` expires. Can be an async function.
*/
timeout(deadline : number | Date, onTimeout ?: () => PromiseLike<T>) : this;

рдЙрдкрд░реНрдпреБрдХреНрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдВ this рдХреЗ рдмрдЬрд╛рдп hacky рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдирд┐рдореНрди рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

/**
* Returns a promise that will await `this` and all the promises in `others` to resolve and yield their results in an array.
* If a promise rejects, the returned promise will rejection with the reason of the first rejection.
* <strong i="21">@param</strong> {Promise<*>} others The other promises that must be resolved with this one.
* <strong i="22">@returns</strong> {Promise<*[]>} The return type is meant to be `Self<T[]>`, where `Self` is the promise type.
*/
and(...others : PromiseLike<T>[]) : ExtendedPromise<T[]>;

рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╣реИрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ this<T[]> рдпрд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдореЗрд░реА рдЫреЛрдЯреА рдорд╛рдлреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рд╣реА рдмрддрд╛рдпрд╛ рд╣реИ) рдорд╛рди рд▓рд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред

рдкреНрд░рд╢реНрди рдореЗрдВ рдкреИрдХреЗрдЬ рдореЗрдВ, рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЬреЗрдиреЗрд░рд┐рдХ рд╡рд░реНрдЧ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдореЗрд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

import { Component, FunctionalComponent } from 'preact';

interface IAsyncRouteProps {
    component?: Component<~,~> | FunctionalComponent<~>;
    getComponent?: (
        this: AsyncRoute,
        url: string,
        callback: (component: Component<~,~> | FunctionalComponent<~>) => void,
        props: any
    ) => Promise<any> | void;
    loading?: () => JSX.Element;
}

export default class AsyncRoute extends Component<IAsyncRouteProps, {}> {
    public render(): JSX.Element | null;
}

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИред

@ Silic0nS0ldier рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЕрднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

type ComponentConstructor = {
    new<A, B>() : Component<A, B>;
}

рдФрд░ рдлрд┐рд░ рдХрд╣рддреЗ рд╣реИрдВ, component ?: ComponentConstructor ред

рдФрд░ рднреА рдЖрдо рддреМрд░ рдкрд░, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let f : <T>(x : T) => T

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

рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ TComponent<T, S> рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕реАрдорд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓рдЧрддрд╛ рд╣реИред


рдЖрдк typeof Component рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ Component рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдореБрджреНрджреЗ рдкреИрджрд╛ рд╣реЛрдВрдЧреЗред

@GregRos рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ (рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред https://gist.github.com/Silic0nS0ldier/3c379367b5e6b1abd76e4a41d1be8217

@ Silic0nS0ldier рдЬреАрд╕реНрдЯ рдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред

@chrisdavies рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

interface IdType<T> {
    id: T;
}

interface User {
    id: number;
    name: string;
}

function doStuff<T extends IdType<any>>() {
    type I = T['id']; // <==== Infer I
    const recs = new Map<I, T>();
    return {
        upsert(rec: T) {
            recs.set(rec.id, rec);
        },
        find(id: I) {
            return recs.get(id);
        },
    };
}

(function() {
    const stuff = doStuff<User>();
    stuff.upsert({ id: 2, name: "greg" });
    console.log(stuff.find(2));
})();

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рд╣рд╛рдВред рдЬреЛ рдореЗрд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рдбреЙрдХреНрд╕ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рд▓рд╛рдкрддрд╛ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реВрдБ!)ред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдУрд░ рдЭреБрдХрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореБрджреНрджреЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдЕрднреА рддрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИрдВред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ T<*, *> рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреЗрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рднреАред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрд╕рдВрдЧрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рд╡реЗ рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХрд╛ рджрд┐рдЦрдирд╛ рдкрд╕рдВрдж рд╣реИ: ~Type, ^Type, &Type рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

interface List<T> {
    push(x : T);
}

function mapList<~L extends ~List, A, B>(list : L<A>, f : (x : A) => B) : L<B>;

(рдореИрдВ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП ~ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)

extends рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВрдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рджреЛ рдмрд╛рддреЗрдВ рдХрд╣реА рд╣реИрдВ:

** 1ред рдпрджрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: ~L рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ ~List рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд * -> * (рдпрд╛ рд╢рд╛рдпрдж * => * , => рдмрд╛рдж рд╕реЗ

  1. ~L ~List рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред **

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП extends рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рд╕рд╣рд┐рдд рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕, рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдорд╛рддрд╛ рддрд░рд╛рдЬреВ рдХреА рддрд░рд╣ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ((* => *) => (* => *)) => * ред

рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП (1) рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

(*, *) => * => *

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рдиреА рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рдЕрд░реНрдерд╛рдд рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдЯреАрд╕реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рддрд░реАрдХрд╛

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

~<A, B> { 
    a : A,
    b : B
}

рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ:

<A, B>() => { a : A, b : B};

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрдпреБрдХреНрдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

~<A><B, C> => [A, B, C]

рдЬреЛ рдХрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдлрдВрдХреНрд╢рди рдЯрд╛рдЗрдк рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред

рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрджрд░реНрдн рд╕реНрдерд╛рдиреАрдп рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

type List<A, B> = ...;

type AdvancedType<~L extends ~<A>List<A, B>, B> = ...;

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ ~<A>List<A, B> рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ B рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдВрдмрдВрдз рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд List<A, *> рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рднреА рд╣реИрдВред

рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз

рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдерд╛ред ~A рд▓рд┐рдП ~B рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
  2. (b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдкрд░рд┐рдорд╛рдг рдХреЗ рд▓рд┐рдП TтВБ, TтВВ, ... ~A , A<TтВБ, TтВВ, ...> B<TтВБ, TтВВ, ...> рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреА рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред

  1. рд╡рд░реНрдЧ MySpecialPromise рдХреЗ рд╡рд╛рджреЗ PromiseLike {} рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ~MySpecialPromise ~PromiseLike рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

  2. рд╡рд░реНрдЧ MyArrayPromiseрд╡рд╛рджреЗ PromiseLike

    рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

(B) рдХрд╛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

(b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдорд╛рдирдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП TтВБ, TтВВ, ... ~A , рд╡рд╣рд╛рдБ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ SтВБ, SтВВ, ... ~B рдХрд┐ A<TтВБ, TтВВ, ...> рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ B<SтВБ, SтВВ, ...> ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдкрд░реЛрдХреНрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдкрд┐рдВрдЧ F (TтВВ, T ..., ...) = SтВВ, SтВВ, ... рд╣реИред рдЗрд╕ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬреНрдб B<...> рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП A<...> рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдВред

рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд╣реА рдореИрдкрд┐рдВрдЧ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реЛрдЧреАред рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рд╣рд░ рдХрдерди:

A<...> extends B<...>

~A рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ ~B рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдореИрдкрд┐рдВрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдкрд┐рдВрдЧ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдХрдердиреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдПрдХ рддрд░реАрдХрд╛ рдХреЗрд╡рд▓ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореБрдЦрдмрд┐рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ implements рдЦрдВрдб рдпрд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рдЬреИрд╕реЗ Scalaред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЧреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

@GregRos - рджрд┐рд▓рдЪрд╕реНрдк рдиреЛрдЯреНрд╕! рдХреБрдЫ рдкреНрд░рд╢реНрдиред


рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ * , рдпрд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ?


рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:
(*, *) => * => * *

рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреИрд╕реЗ L<A> рддрд░рд╣ * ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛрдбрд╝реАрджрд╛рд░ рдирд┐рд░реНрдорд╛рддрд╛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдХреНрдпрд╛ (* => *) => * => * рдареАрдХ рд╣реЛрдЧрд╛?


рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рддрд░реАрдХрд╛

~<A, B> { 
    a : A,
    b : B
}
inferface TyCon<A, B> { 
    a : A,
    b : B
}

рдХреНрдпрд╛ рдпреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рдЕрдирд╛рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрд▓рдЧ рд╣реИрдВ?


рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз

~A рдФрд░ ~B рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдмрдВрдз рд╣реИ? рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рджреВрд╕рд░реЗ рдХрд╛ 'рдЙрдкрдкреНрд░рдХрд╛рд░' рд╣реИ? рдХреНрдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдЕрднрд┐рдкреНрд░рд╛рдп рд╣реИ? рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдЬреИрд╕реЗ L<A> рддрд░рд╣ * рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛрдбрд╝реАрджрд╛рд░ рдирд┐рд░реНрдорд╛рддрд╛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╣реИ, рдХреНрдпрд╛ (* => *) => * => * рдареАрдХ рд╣реЛрдЧрд╛?

рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ред рд╣рд░ рдПрдкреНрд▓реАрдХреЗрд╢рди рдЬреИрд╕реЗ L<A> рддрд░рд╣ * рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рдкрд░ рдХреИрд╕реЗ рдмреЗрдЪреА рдЧрдИ рд╣реВрдВред


рдХреНрдпрд╛ рдпреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рдЕрдирд╛рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрд▓рдЧ рд╣реИрдВ?

рдкрд╣рд▓рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛ рдПрдХ рдШреЛрд╖рдгрд╛ рд╣реИред рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐ рдпреЗ рдкреНрд░рдХрд╛рд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ:

{
     a : number;
     b : string;
}

interface Blah {
    a : number;
    b : string;
}

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХрдИ рдкреНрд░реЗрд░рдгрд╛рдПрдБ рд╣реИрдВ:

  1. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрд╛рдХреА рд╕рдм рдХреА рддрд░рд╣, рдпрд╣ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдФрд░ рдЧреБрдордирд╛рдо рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
  2. рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЬреИрд╕реЗ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдИ рдЧрдИ рдЕрдирд╛рдо рд╡рд╕реНрддреБ) рдХреБрдЫ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдШреЛрд╖рдгрд╛ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

~A рдФрд░ ~B рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╣реИ? рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рджреВрд╕рд░реЗ рдХрд╛ 'рдЙрдкрдкреНрд░рдХрд╛рд░' рд╣реИ? рдХреНрдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

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

рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ "рдЕрдиреБрд░реВрдкрддрд╛" рд╕рдВрдмрдВрдз рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╡рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рджреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ Promise<T> , Bluebird<T> , рдФрд░ рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рдЯреАрд╕реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд╕рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ PromiseLike<T> рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╢рдмреНрдж рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдпрд╣ рдорд╛рдирдХрд░ рдХрд┐ рд╣рдордиреЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдмрдирд╛рдпрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ:

function mapPromise<~P extends ~PromiseLike, A, B>(promise : P<A>, func : (x : A) => B) : P<B>;

рдФрд░ рдмрд╛рдзрд╛ ~P extends ~PromiseLike рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рд╡рд╛рджреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рд╡рд╛рджреЗ рдХрд░рддрд╛ рд╣реИред рдмрд╛рдзрд╛ рдпрд╣ рднреА рдЧрд╛рд░рдВрдЯреА рджреЗрдЧреА рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ promise PromiseLike<A> рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╕рджрд╕реНрдп рдареАрдХ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореМрдЬреВрдж рд╕рд╛рдмрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрд╕реА рддрд░рд╣ Promise<T> extends PromiseLike<T> , рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рд╣реИрдВ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, ~Promise extends ~PromiseLike рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рдмрдЯрд╛рдЗрдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

interface MyPromise<T> extends Promise<T[]> {}

рдХреНрдпрд╛ рд╣рдо ~MyPromise рд╕реЗ рдЕрдзрд┐рдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо ~Promise рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЕрдореВрд░реНрдд рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рд░рд┐рд╢реНрддреЗ рдХреЛ рдХреИрд╕реЗ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ?

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЬрд┐рд╕ рдореИрдкрд┐рдВрдЧ рдХреА рдмрд╛рдд рдХреА рдереА, рд╡рд╣ рд╣реИ рдореИрдкрд┐рдВрдЧ, рдЬрд┐рд╕реЗ ~MyPromise рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, ~Promise рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ ~MyPromise рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛред ~Promise рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рддред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдкрд┐рдВрдЧ рдЗрд╕ рддрд░рд╣ рд╣реИ:

T => T[]

@GregRos

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ~MySpecialPromise ~PromiseLike рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВред

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡реЗрджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, MySpecialPromise рдХреЛ MySpecialPromise<TSpecial, TPromiseVal> рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ ~MySpecialPromise<SpecialType> рдХрд╛ рд╕рдорд╛рди ~Promise ред

@GregRos

рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ "рдЕрдиреБрд░реВрдкрддрд╛" рд╕рдВрдмрдВрдз рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╡рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рджреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд╛рджрд╛, рдмреНрд▓реВрдмрд░реНрдб, рдФрд░ рдЗрд╕реА рддрд░рд╣, рдореБрдЭреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░реЙрдорд┐рд╕рд▓рд╛рдЗрдХ рдХреЗ рд╕рд╛рде рдЯреАрд╕реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд╕рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИрдХрд┐рд╕реА рддрд░рд╣ред
function mapPromise<~P extends ~PromiseLike, A, B>(promise : P<A>, func : (x : A) => B) : P<B> ;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рдкреНрд░рдХрд╛рд░реНрдп-рдЬрд╛рдБрдЪ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЖрдк BlueBird<T> рдФрд░ PromiseLike<T> рдЪреБрдиреЗ рд╣реБрдП T рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХрдЬреБрдЯ рд╣реЛрдВрдЧреЗ, рдпреЗ рд╕рд┐рд░реНрдл рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ рдЙрдк-рдпреЛрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддреЗ рд╣реИрдВред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП ~BlueBird рдФрд░ ~PromiseLike рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдмрдВрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?


let x: <P extends ~PromiseLike>(input : P<A>, func : (x : A) => B) : P<B>;
let y: <P extends ~BlueBird>(input : P<A>, func : (x : A) => B) : P<B>;
x = y;

рдпрд╣рд╛рдВ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ y рдХреА рдмрд╛рдзрд╛рдПрдВ x рдХреА рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдорд╢реАрдирд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ BlueBird<T> PromiseLike<T> рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдпрд╣ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рдзрд╛ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

~ P рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ A , P<A> рдХреЗ рд▓рд┐рдП PromiseLike<A> рдХрд╛ рдЙрдк-рдкреНрд░рдХрд╛рд░ рд╣реИред

рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

function mapPromise<~P, A, B where P<A> extends PromiseLike<A>>

рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ P<A> рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

class PromiseCreator<~P extends ~PromiseLike> {
    create<A>() : P<A>;
}

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:

//Here A is not a captured type parameter
//It's an existential type we introduce to constrain ~P
class PromiseCreator<~P with some A where P<A> extends PromiseLike<A>> {
    create<A>() : P<A>;
}

рдлрд┐рд░ рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рднреАрддрд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╡рд╢ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдПрдХ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рдХрдИ рдореБрджреНрджреЗ рд╣реЛрдВрдЧреЗ:

  1. ((* => *) => *) => * рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рд╕рднреА рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд░реНрдЧ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдиреАрд▓рдордгрд┐ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  2. рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рд╢реНрди рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
  3. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕реЗ рдХрдо рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИред
  4. рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред

@GregRos

рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ? рдЖрдк рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ?

_Personally_ рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:

function mapPromise<P extends PromiseLike, A, B>(p: P<A>, f: (x: A) => B): P<B>

class PromiseCreator<P extends PromiseLike> {
    create<A>() : P<A>;
}

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ number рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рдирд▓-рдЖрд░реНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ: рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЧреЛрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзрдордиреА рд╣реИ (рдореИрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдХрд░реА рдХрд╛ рдорди рдирд╣реАрдВ рдмрдирд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рд╕рд┐рд░реНрдл MySpecialPromise<SpecialType> рд▓рд┐рдЦ рд╕рдХреЗрдВ)ред

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ interface MyPromise<T> extends Promise<T[]> {} рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╣реВрдБрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЙрдкрдпреЛрдЧреА рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреАред

рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдХрд╣ рд░рд╣рд╛ рд╣реИ: ~MyPromise extends ~(Promise . []) рдЬрд╣рд╛рдВ [] рд╕реВрдЪреА рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ рдФрд░ . рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд░рдЪрдирд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рдЧрдИ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рддрд░реНрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛!

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ P extends Foo рд▓рд┐рдЦреВрдВ, рдЬрд╣рд╛рдБ Foo рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд type Foo<T = {}> = ... , рддреЛ P рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рд╣реИ?

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ (рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдорд┐рд▓реА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ)ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд░реАрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИред

рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд░реА рдпрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

Foo<number, _>  // equivalent to `type Foo1<A> = Foo<number, A>`

@ рдХреИрдорд░реВрди-рдорд╛рд░реНрдЯрд┐рди

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

P рдпрд╣ рдЕрдкрдиреА рддрд░рд╣ рдХрд╛ рд╣реИ, рд╣реИ рдирд╛? рд╕рд╡рд╛рд▓ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо Foo ~Foo Foo рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ Foo<{}> : рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдкреА рдХреЗ рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ P рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд▓ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ P рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ * => * , рддреЛ рд╣рдо Foo рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

@Pauan рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реИред

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдореИрдВрдиреЗ рдорд╛рдирд╛ рд╣реИ рдХрд┐ рдЙрдкрдорд╛ рдХреА рдзрд╛рд░рдгрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ:

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдерд╛ред ~A рд▓рд┐рдП ~B рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
  2. (b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдкрд░рд┐рдорд╛рдг рдХреЗ рд▓рд┐рдП TтВБ, TтВВ, ... ~A , A<TтВБ, TтВВ, ...> B<TтВБ, TтВВ, ...> рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрджрд┐ MyPromise<T> extends Promise<T[]> рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ MyPromise<T> рдХреЛ рдХрд╣реАрдВ рднреА Promise<T[]> рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ as рдПрдХ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП a : MyPromise<T> рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Promise<T[]> , рдЖрдк upcasting рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдбрдВрдмрдирд╛ рд╣реЛрдЧрд╛ a рдЕрдзрд┐рдХ рдЖрдмрдВрдЯрд┐рддред

рдореМрдЬреВрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ, рдЬреЛ рдореМрдЬреВрджрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

function id1<A, ~P extends ~PromiseLike>(p : P<A>) : P<A>;

function id2<A, P extends Promise<A[]>>(p : P) : P {
    //ERROR - P does not extend PromiseLike<A>
    return id1(p);
}

рдЯрд╛рдЗрдкрд┐рдВрдЧ рдПрдХ рд╕рд╛рдЗрдб-рдЗрдлрд╝реЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдирд╛рдордорд╛рддреНрд░ рдХреА рд╣реЛ рдЬрд╛рдПрдЧреАред рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрдЪрд╛рдирдХ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ:

type GenericNumber<T> = number;

type RegularNumber = number;

рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдЯрд┐рд▓ рд╕рдВрдШ / рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ, рд╕рджрд╕реНрдп рд╕рдордЭ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдкрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛ред

рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐: рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдкрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХреЛ рдореМрдЬреВрджрд╛ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ 99% рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдмрдордмрд╛рд░реА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХрд╛рдиреВрди рджреНрд╡рд╛рд░рд╛ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдПрдХ рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдПрдХ рдорд╛рдзреНрдпрдорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЬреИрд╕реЗ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╕), рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рддреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдпрд╛ рдлрд┐рд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рд╕рд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ @GregRos рдореИрдВрдиреЗ рдЖрдкрдХреА рдмрд╛рдж рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ

рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдкрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХреЛ рдореМрдЬреВрджрд╛ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕рд┐рд░ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдПрдХ рдорд╛рдзреНрдпрдорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЬреИрд╕реЗ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╕), рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рддреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдпрд╛ рдлрд┐рд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рд╕рд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрдЪреНрдЪрддрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдЧрд░ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЕрдиреНрдпрдерд╛ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рд╣реА рд╣реИрдВред


рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЪреАрдЬреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╕ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЕрдЧрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╣рд╛рди рд╣реЛрдЧрд╛!

рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдзрд╛рд░рдгрд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореЗрд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЗ рдирд┐рдпрдореЛрдВ рдХреА рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ?

(b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдкрд░рд┐рд╕реАрдорди рдХреЗ рд▓рд┐рдП T, T of, ... ~ A рдХрд╛, рд╡рд╣рд╛рдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ SтВБ, S ~, ... рдХрд╛ ~ B рдореМрдЬреВрдж рд╣реИ рдЬреИрд╕реЗ рдХрд┐ A

рдХреНрдпрд╛ X, F (A, B) = (рд╕рдВрдЦреНрдпрд╛, B) рдХреА рдореИрдкрд┐рдВрдЧ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ Y рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред

type X = ~<A,B> = {x : B};
type Y = ~<A,B> = A extends number ? {x: B} : never;

рд╣рд╛рд▓рд╛рдВрдХрд┐ X<string,number> Y<string,number> рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХрд╛ _existence_ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ~ рдП рдФрд░ ~ рдмреА рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ ~ рдмреА рд╕рдиреНрдирд┐рдХрдЯ ~ рдП, рдпрд╛ ~ рдП ~ рдмреА рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдп ~ рд╕реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ ~ рдП рдПрдХ рд╣реИ рд╕рдмрдЯрд╛рдЗрдк (~ рдмреАред ~ рд╕реА), рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ (рд╕реА рдореИрдкрд░ рд╣реИ)ред рдореБрдЭреЗ _all_ рдореИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдмрдирдирд╛ рд╣реИред

function id1<A, ~P extends ~PromiseLike>(p : P<A>) : P<A>;

function id2<A, P extends Promise<A[]>>(p : P) : P {
    //ERROR - P does not extend PromiseLike<A>
    return id1(p);
}

рдореИрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдЗрдирдореЗрдВ рд╕реЗ рдореЗрд░рд╛ рдкрдарди рдпрд╣ рд╣реИ рдХрд┐ id1 P рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдЗрдирдкреБрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рднреА _inputs_ рдХреЗ рд▓рд┐рдП PromiseLike рджреЗрддрд╛ рд╣реИред рдЬрдмрдХрд┐ id2 рдПрдХ рдРрд╕реЗ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ Promise to A [] рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ id1 , рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ id2 ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреА рдмрд╛рдд рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВред

рдпреЗ рдкреНрд░рдХрд╛рд░ рдЕрдЪрд╛рдирдХ рднрд┐рдиреНрди рд╣реЛрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ

рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЖрдкрдХреА рдмрд╛рдд рдпрд╛рдж рдЖ рд░рд╣реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд╣реИрдВред рдореИрдВ RegularNumber рдХреЛ GenericNumber рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛, рдореБрдЭреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рддрд░реНрдХ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рд╣рдо рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ~ рдП рдФрд░ ~ рдмреА рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ ~ рдмреА рд╕рдиреНрдирд┐рдХрдЯ ~ рдП, рдпрд╛ ~ рдП ~ рдмреА рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдп ~ рд╕реА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ ~ рдП рдПрдХ рд╣реИ рд╕рдмрдЯрд╛рдЗрдк (~ рдмреАред ~ рд╕реА), рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ (рд╕реА рдореИрдкрд░ рд╣реИ)ред рдореБрдЭреЗ рд╕рднреА рдореИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдмрдирдирд╛ рд╣реИред

рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рдЙрдВрдЯрд░-рдЙрджрд╛рд╣рд░рдг рд╣реИред рдореБрдЭреЗ рдЕрдиреНрдп рдкреНрд░рддрд┐-рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗ рд╣реИрдВред рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдФрд░ рдЖрдкрдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрддреНрддрд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕рд╣реА рд╣реИрдВ рдФрд░ рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░рд╛ рдЬреЛ рдорддрд▓рдм рд╣реИ, рд╡рд╣ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрдЪреНрдЪрддрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдЧрд░ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЕрдиреНрдпрдерд╛ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рд╣реА рд╣реИрдВред

рдпрд╣ рдпрд╛ рддреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрд╛ рдХреБрдЫ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Foo рдХреЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк ~Foo рдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП Foo<*> рдпрд╛ ~<A>Foo<A> рдпрд╛ рдХреБрдЫ рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╣рд╛рдВ, рдЖрдк рдПрдХ рдЙрдкрдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ:

type Foo2<T> = Foo<T>

рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд╣рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд┐рдВрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдЗрдирдореЗрдВ рд╕реЗ рдореЗрд░реА рд░реАрдбрд┐рдВрдЧ рдпрд╣ рд╣реИ рдХрд┐ id1 рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди P рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдЗрдирдкреБрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рднреА рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ PromiseLike рджреЗрддрд╛ рд╣реИред рдЬрдмрдХрд┐ id2 рдПрдХ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ Promise to A [] рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдИрдбреА 1 рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрдИрдбреА 1 рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреА рдмрд╛рдд рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВред

рдпрд╣реА рд╕рд╣реА рд░реАрдбрд┐рдВрдЧ рд╣реИ, рд╣рд╛рдБред рд▓реЗрдХрд┐рди рдЕрдЧрд░ P extends Promise<A[]> рдпрд╣ рдХрд┐рд╕реА рднреА рдЬрдЧрд╣ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Promise<A[]> рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ id1 ред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдЕрднреА рд╣реИ, рдФрд░ рдХреНрдпрд╛ рдШрдЯрд╛рд╡ рдХрд╛ рдорддрд▓рдм рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдм рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЖрдкрдХреА рдмрд╛рдд рдпрд╛рдж рдЖ рд░рд╣реА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд╣реИрдВред рдореИрдВ рдЬреЗрдирд░рд┐рдХрдирдВрдмрд░ рдХреЗ рд╕рд╛рде рд░реЗрдЧреБрд▓рд░рдирдВрдмрд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдореБрдЭреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рддрд░реНрдХ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ: GenericNumber<T> , рд╕рднреА T , рдФрд░ RegularNumber рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рдФрд░ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВред рдРрд╕рд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЪреЗрдХ рдЯрд╛рдЗрдк рдХрд░реЗрдЧрд╛ рдФрд░ рджреВрд╕рд░рд╛ рдирд╣реАрдВред рдЕрднреА, рдХрдо рд╕реЗ рдХрдоред

рд╣рдо рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдмрдирд╛ рджреЗрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ GenericNumber<T> рдПрдХ TC рд╕реЗ рд╣реИ, рдпрд╣ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдБ RegularNumber рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рддреЛ рдпрд╣ рдЕрдм рд╡рд┐рдирд┐рдореЗрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдмреБрд░рд╛ рд╣реЛред рдмрд╕ рдПрдХ рдирдпрд╛, рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреА "рд╕рдВрд░рдЪрдирд╛" рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TC рдХреБрдЫ рдФрд░ рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВрдЧреЗред

рдирдИ рджрд┐рд╢рд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ рдХрд┐ рд╕рд╣реА рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ:

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдерд╛ред ~A ~B рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП:

  1. (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
  2. (b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдорд╛рдкрджрдгреНрдб рдХреЗ рд▓рд┐рдП TтВБ, TтВВ, ... ~A , A<TтВБ, TтВВ, ...> B<TтВБ, TтВВ, ...> рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрд╛рдд ... рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдмреЗрд╡рдХреВрдл рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ MyPromise<T> extends Promise<T[]> рдФрд░ ~Promise рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдХреЛрдИ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рдирд┐рдпрдо рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ ~Promise рд╕рдорд╛рди рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, ~ рдХреЛ "рдСрдкрд░реЗрдЯрд░ рдХреА рдЯреАрд╕реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ" рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдИ рдХрд╛рд░рдг рдмрддрд╛рдП рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ:

  1. рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрджрд┐рдЧреНрдзред

    1. рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рднреА рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреА рдЬрдм рд╡реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВред

    2. рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдЧреНрд░рдВрдереЛрдВ рдФрд░ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ Promise рд▓рд┐рдЦрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрд┐рд▓рдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдЕрднреА рд╣реИред рдЯреАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред

  2. рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлреИрд▓реА рд╣реБрдИ рд╣реИред
  3. рдЖрд╕рд╛рди рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИред рдХрд┐рд╕реА рднреА ~\w рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрд╕реЗ рдЯреАрд╕реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  4. рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЕрдкрдиреА рд░рд╛рдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдпреВрдирд┐рдпрдиреЛрдВ, рдЪреМрд░рд╛рд╣реЛрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдХреНрдпрд╛ рдУрд╡рд░рд▓реЛрдбреЗрдб / рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреЙрд░реНрдо * & (* => *) , * | (* => *) , рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдиреВрдиреА рд╣реИрдВ? рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧ рд╣реИрдВ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рдмреБрд░реЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдард┐рди рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП * | (* => *) рддрд╛рдХрд┐ рдЖрдк рдЙрд╕рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВред

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

type Example<A = number> = {}

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ * & (* => *) рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ ~Promise | ~Array рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд┐рди рдЪреАрдЬреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛

рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐:

type Example = (<~P extends ~Promise>() => P<number>) | (<~M extends ~Map>() => Map<string, number>);

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (* => *) | (*, *) => * рдХреА рддрд░рд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ

рдЕрдиреНрдп рдЯреАрд╕реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг?

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЯреАрд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЯреАрд╕реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ * => (* => *) ред рд╡реЗ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрджрд░реНрд╢ рд╣реИрдВ рдЬреЛ рдХрд░реА рдФрд░ рд╕рдорд░реНрдерди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд╣реАрдВред

рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ ~ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрдХреАрдирди рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

~<A>~<B>{a : A, b : B}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред

рдЙрдЪреНрдЪ-рд░реИрдВрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛?

рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдмрд╛рддрдЪреАрдд рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ:

type Example<T> = <~P extends ~Promise>(p : P<T>) : P<T>;

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

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрдпрд╛ рдРрд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдЯреАрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рдореЗрд░рд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

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

  1. рдЕрдкрдиреЗ рдЕрд╡рд░реЛрдзреЛрдВ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рддрд░рд╣ рд╕реНрдерд╛рдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  2. рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рдФрд░ рд▓рдЪреАрд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ: ~<A>Map<string, A> , ~<A, B>Map<B, A> , рдФрд░ рдЗрд╕реА рддрд░рд╣ред
  3. рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд░ рджреВрд╕рд░реЗ рдкрд╣рд▓реВ рдореЗрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреАрд╕реАрдПрд╕ рдореЗрдВ рднреА рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЯреАрд╕реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛

рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдлреАрдЪрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

type Example<~P extends ~PromiseLike> = ~P extends ~Promise ? 0 : 1

рдореБрдЭреЗ рдЦреБрдж рдкрд░ рдкреВрд░рд╛ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрднреА рддрдХ рдкрдЪрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рд╕рдВрдХрд▓реНрдк

рдореБрдЭреЗ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рдЕрднреА рдХрд┐рд╕реА рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддрд╛ред

рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ, рдЕрдЧрд░ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдордзреНрдпрд╕реНрде рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рд╕рд┐рд╕реНрдЯрдо F <: рдпрд╛ рд╕рд╛рдЙрдВрдб рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдПрдордПрд▓ рдЬреИрд╕реЗ рд╕рд╛рдЙрдВрдб рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реЗ рдПрдХред

рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд░рд╣реВрдБрдЧрд╛ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рдП
https://github.com/Microsoft/TypeScript/issues/14833

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ # 17961 рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рджреЗрдЦреЗрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Bifunctor рдФрд░ Profunctor рдкреНрд░рдХрд╛рд░ рдмрд╛рдзрд╛ рд╕реНрддрд░ рдкрд░ рдереЛрдбрд╝реЗ рдЬрдЯрд┐рд▓ рд╣реИрдВ - рдЕрдЧрд░ infer T рдмрдЬрд╛рдп рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ред this рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ (рдЬреЛ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рд╣реИ) - рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

(рдореИрдВ рдПрдХ рднрд╛рд░реА TS рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред @ tycho01 рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░

@isiahmeadows @ tycho01 рд╡рд╛рд╣ ...

рдЖрдк рд╕рд╣реА рд╣реЗред рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рдорддрднреЗрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

function example<~P extends ~PromiseLike>(p : P<number>) : P<string>;

рдпрд╣рд╛рдБ рдЖрдк ~Promise рдФрд░ ~Bluebird p рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ:

function example<F extends <T>(t: T) => PromiseLike<T>>(p : F(number)) : F(string)

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

example(null as Promise<number>)

рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ F рдХрд╛ рдЕрд░реНрде рд╣реИ:

<T>(t : T) => Promise<T>

рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдЯреАрд╕реА рдХреЗ рд╕рд╛рде, рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ "рдирд┐рд╣рд┐рдд" рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ: рдЙрдирдХреА рдЯреАрд╕реАред

рдореМрдЬреВрджрд╛ рдЯреАрд╕реА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

рдЖрдк рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ ~Promise рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

type PromiseTC = <T>() => Promise<T>

рд╕рдЪ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдлрд╝реЗрдХреНрд╢рди рдореБрджреНрджрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рдПрдХ рдЬреНрдЮрд╛рдд рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ (рдЖрдорддреМрд░ рдкрд░ рдЬреЛ рд╣реЛрддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛) рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛред

рдпрд╣ NoInfer<T> рд░рдгрдиреАрддрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднрд╛рдЧ рдореЗрдВ рд╣рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ 100% рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдЖрдо рдорд╛рдорд▓реЗ рдХреЛ рднреА рдХрд┐рддрдирд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@GregRos

рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, ~ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЧреБрдг рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯреНрд░реЗрдВрд╕ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред


рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрд╛рдд ... рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдмреЗрд╡рдХреВрдл рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ MyPromise рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИрд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХреА рдЪреАрдЬ рдЕрднреА рднреА рдПрдХ рдЙрдкрдпреЛрдЧреА рдзрд╛рд░рдгрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдКрдкрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдХрднреА рднреА ~MyPromise ~Promise рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕ рдЪреАрдЬрд╝ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ~MyPromise рдФрд░ ~<T>Promise<T[]> , рдЬрд┐рд╕реЗ рд╣рдо ~(Promise . []) рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдмрд╛рдд рдпрд╛рдж рдЖ рд░рд╣реА рдереА рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХреЛ рдЙрдк-рд╕рдВрдмрдВрдз рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрд╣ Promise рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗрд╡рд▓ рд╕реВрдЪреА рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред

interface A<T> {
    x: T;
} 

interface B<T> {
    x: T[];
}

рдХреНрдпрд╛ ~<T>B<T> ~<T>A<T[]> ? рд╣рд╛рдБред рдХреНрдпрд╛ ~<T>B<T> ~<T>A<T> ? рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рд╡реЗ рджреЛ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрди рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред


рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

function example<~P extends ~PromiseLike>(p : P<number>) : P<string>;
рдпрд╣рд╛рдВ рдЖрдк рдкреА рд╕реЗ ~Promise рдФрд░ ~Bluebird рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдзрд┐рдХ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ A рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рдХрд╛рд░ A<number> рдФрд░ {x: number} рдЕрдкреНрд░рднреЗрджреНрдп рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╕реЗред рдХреНрдпрд╛ P P<number> рд╕реЗ рд╡рд╕реВрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдмрд╕ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдм рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

# 17961 рд╕реЗ рдХреНрд░реЙрд╕-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ @isiahmeadows рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХреЙрд▓ рдкрд░ рдкрд┐рдЫрдбрд╝реЗ рдЗрдВрдЯреНрд░реЗрдВрд╕ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЗрдирдкреБрдЯ Promise<number> рдпрд╛ Bluebird<number> рд╣рдо рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ string рд╕рд╛рде рдкреБрди: рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╕рдордХрдХреНрд╖ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рддрд░рд╣ рд╣реИрдВ (рд╣рдо рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рд╣реИ, рдареАрдХ рд╣реИ?), рддреЛ рдпрд╣ рддрд░реНрдХ рднреА рдирдХрд▓реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЙрджрд╛ Bluebird рдмрдЬрд╛рдп рджреЛ рдкрд░рдо рдкреНрд░рдХрд╛рд░ рдереЗ, рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдорд╛рд░рд╛ <string> рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрдм рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рд╡рд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБред (рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдкрд░ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рд╣реВрдБред)

@ tycho01 рдХреНрдпрд╛ рдпреЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджреВрд░ рд╣реЛ T рддрддреНрдХрд╛рд▓

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕: # 17961 рдХреЗ рд╕рд╛рде рдЕрдм рддрдХ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдкреИрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ:

let arr = [1, 2, 3];
let inc = (n: number) => n + 1;
let c = arr.map(inc); // number[]
let map = <Functor extends { map: Function }, Fn extends Function>(x: Functor, f: Fn) => x['map'](f); // any on 2.7 :(
let e = map(arr, inc);

@ tycho01 рд╣рд╛рдВ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдмрд╣реБрдд рд╣реА рднрдпрд╛рдирдХ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ T рдХреА рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкрд░ рддреНрд╡рд░рд┐рдд рдирд╣реАрдВ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

interface TyCon<A> {
    C: <A>(x: A) => TyCon<A>
}

interface Functor<A> extends TyCon<A> {
    C: <A>(x: A) => Functor<A>;
    fmap<B>(this: this["C"](A), f: (x: A) => B): this["C"](B);
}

interface Option<A> extends Functor<A> {
    C: <A>(x: A) => Option<A>;
}

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ fp-ts рдореЗрдВ ADT рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рдБред рд╢рд╛рдпрдж TyCon рдмрд┐рдирд╛ рднреАред

@ рдЬреИрдХ-рд╡рд┐рд▓рд┐рдпрдореНрд╕ @isiahmeadows :

рдореИрдВрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА $Call рдЙрдкрд▓рдмреНрдз рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрддреНрддрд░рджрд╛рдпреА рдмрди рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ ...

interface Functor<A> {
    C: <A>(x: A) => Functor<A>;
    fmap<B>(f: (x: A) => B): $Call<$ElementType<this, "C">, B>;
}
// this: $Call<$ElementType<this, "C">, A>, 
// ^ flow doesn't seem to do `this` params

interface Option<A> extends Functor<A> {
    C: <A>(x: A) => Option<A>;
}

let o: Option<string>;
let f: (s: string) => number;
let b = o.fmap(f);

@ tycho01 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ $ElementType this рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

@ tycho01 рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди: https://goo.gl/tMBKyJ

@goodmind : hm, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Maybe<number> рдмрдЬрд╛рдп Functor<number> Functor Maybe fmap рд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж Maybe ред
рдЯрд╛рдЗрдк рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд░рди-рдЯрд╛рдЗрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╡рд╣рд╛рдВ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред
рдЕрдм, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ fmap рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреВрд╕рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╡рд╛рдкрд╕ред : /

Https://github.com/SimonMeskens/TypeProps/issues/1 рдкрд░ рдХреБрдЫ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд┐рдЪрд╛рд░

рдореИрдВ рдПрдХ рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдПрдПрд╕рдПрдкреА рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдореЗрд░реЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рд╣реЗрдбреНрд╕ рдЕрдк рдореИрдВрдиреЗ рдЗрд╕реЗ # 23809 рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЕрдзреВрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рджреЗрдЦреЗрдВред

рдореИрдВрдиреЗ рдЖрдк рд▓реЛрдЧреЛрдВ рд╕реЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рдпрд╣ рдпрд╣рд╛рдБ рд╣реИред рдпрд╣ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИред

type unknown = {} | null | undefined;

// Functor
interface StaticFunctor<G> {
    map<F extends Generic<G>, U>(
        transform: (a: Parameters<F>[0]) => U,
        mappable: F
    ): Generic<F, [U]>;
}

// Examples
const arrayFunctor: StaticFunctor<any[]> = {
    map: <A, B>(fn: (a: A) => B, fa: A[]): B[] => {
        return fa.map(fn);
    }
};
const objectFunctor: StaticFunctor<object> = {
    map: <A, B>(fn: (a: A) => B, fa: A): B => {
        return fn(fa);
    }
};
const nullableFunctor: StaticFunctor<object | null | undefined> = {
    map: <A, B>(
        fn: (a: A) => B,
        fa: A | null | undefined
    ): B | null | undefined => {
        return fa != undefined ? fn(fa) : fa;
    }
};

const doubler = (x: number) => x * 2;

const xs = arrayFunctor.map(doubler, [4, 2]); // xs: number[]
const x = objectFunctor.map(doubler, 42); // x: number
const xNull = nullableFunctor.map(doubler, null); // xNull: null
const xSome = nullableFunctor.map(doubler, 4 as number | undefined); // xSome: number | undefined

const functor: StaticFunctor<unknown | any[]> = {
    map(fn, fa) {
        return Array.isArray(fa)
            ? arrayFunctor.map(fn, fa)
            : fa != undefined
                ? objectFunctor.map(fn, fa)
                : nullableFunctor.map(fn, fa);
    }
};

const ys = functor.map(doubler, [4, 2]); // ys: number[]
const y = functor.map(doubler, 42); // y: number
const yNull = functor.map(doubler, null); // yNull: null
const ySome = functor.map(doubler, 42 as number | undefined); // ySome: number | undefined

// Plumbing
interface TypeProps<T = {}, Params extends ArrayLike<any> = never> {
    array: {
        infer: T extends Array<infer A> ? [A] : never;
        construct: Params[0][];
    };
    null: {
        infer: null extends T ? [never] : never;
        construct: null;
    };
    undefined: {
        infer: undefined extends T ? [never] : never;
        construct: undefined;
    };
    unfound: {
        infer: [NonNullable<T>];
        construct: Params[0];
    };
}

type Match<T> = T extends infer U
    ? ({} extends U ? any
        : TypeProps<U>[Exclude<keyof TypeProps, "unfound">]["infer"]) extends never
    ? "unfound"
    : {
        [Key in Exclude<keyof TypeProps, "unfound">]:
        TypeProps<T>[Key]["infer"] extends never
        ? never : Key
    }[Exclude<keyof TypeProps, "unfound">] : never;


type Parameters<T> = TypeProps<T>[Match<T>]["infer"];

type Generic<
    T,
    Params extends ArrayLike<any> = ArrayLike<any>,
    > = TypeProps<T, Params>[Match<T>]["construct"];

рдореИрдВрдиреЗ рдирдореВрдирд╛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдФрд░ рд╕рд░рд▓ рдХрд┐рдпрд╛, рдпрд╣рд╛рдБ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ рднреА рд╣реИ:
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

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

рдЬреАрдердм рд▓рд┐рдВрдХ

рдореИрдВ рд╕рдВрддреГрдкреНрдд рд╡рд┐рд╡рд░рдг рдХреЗ рднреАрддрд░ рдЖрднрд╛рд╕реА рдкреНрд░рдХрд╛рд░ рдЪрд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдЪрдХреЗрдЯреА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ:

declare const index: unique symbol;

// A type for representing type variables
type _<N extends number = 0> = { [index]: N };

// Type application (substitutes type variables with types)
type $<T, S, N extends number = 0> =
  T extends _<N> ? S :
  T extends undefined | null | boolean | string | number ? T :
  T extends Array<infer A> ? $Array<A, S, N> :
  T extends (x: infer I) => infer O ? (x: $<I, S, N>) => $<O, S, N> :
  T extends object ? { [K in keyof T]: $<T[K], S, N> } :
  T;

interface $Array<T, S, N extends number> extends Array<$<T, S, N>> {}

// Let's declare some familiar type classes...

interface Functor<F> {
  map: <A, B>(fa: $<F, A>, f: (a: A) => B) => $<F, B>;
}

interface Monad<M> {
  pure: <A>(a: A) => $<M, A>;
  bind: <A, B>(ma: $<M, A>, f: (a: A) => $<M, B>) => $<M, B>;
}

interface MonadLib<M> extends Monad<M>, Functor<M> {
  join: <A>(mma: $<M, $<M, A>>) => $<M, A>;
  // sequence, etc...
}

const Monad = <M>({ pure, bind }: Monad<M>): MonadLib<M> => ({
  pure,
  bind,
  map: (ma, f) => bind(ma, a => pure(f(a))),
  join: mma => bind(mma, ma => ma),
});

// ... and an instance

type Maybe<A> = { tag: 'none' } | { tag: 'some'; value: A };
const none: Maybe<never> = { tag: 'none' };
const some = <A>(value: A): Maybe<A> => ({ tag: 'some', value });

const { map, join } = Monad<Maybe<_>>({
  pure: some,
  bind: (ma, f) => ma.tag === 'some' ? f(ma.value) : ma,
});

// Not sure why the `<number>` annotation is required here...
const result = map(join<number>(some(some(42))), n => n + 1);
expect(result).toEqual(some(43));

рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ: https://github.com/pelotom/hkts

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд!

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

  1. рдмрд░реНрдЯреНрд░реЗрдВрдб рдореЗрдпрд░ рдиреЗ рдЕрдкрдиреА 1988 рдХреА рдкреБрд╕реНрддрдХ "рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди" рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ред

рдЙрджрд╛рд╣рд░рдг рдПрдлрд┐рд▓ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдЯрд╛ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

https://gist.github.com/mlhaufe/089004abd14ad8e7171e2a122198637f

рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдордзреНрдпрд╡рд░реНрддреА рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рднрд╛рд░реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рд╕-рдлреИрдХреНрдЯрд░реА рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд┐рдХреНрд╕рд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдлреА рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

# 17588 рдкрд░ рдХреБрдЫ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ

  1. рдСрдмреНрдЬреЗрдХреНрдЯ рдПрд▓рдЬреЗрдмреНрд░рд╛ (рдФрд░ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлреИрдХреНрдЯреНрд░реАрдЬрд╝) рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╕рдордп рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

C<T> рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ App<t,T> рдЬрд╣рд╛рдБ T рд╡рд░реНрдЧ рд╣реИ, рдФрд░ t C рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдПрдХ рдЕрдиреВрдард╛ рдЯреИрдЧ рд╣реИ

interface App<C,T> {}

рдирдореВрдирд╛:

interface IApp<C,T> {}

interface IList<C> {
    Nil<T>(): IApp<C,T>
    Cons<T>(head: T, tail: IList<C>): IApp<C,T>
}

// defining data
abstract class List<T> implements IApp<typeof List, T> {
    // type-safe down-cast
    static prj<U>(app: IApp<typeof List, U>): List<U> { return app as List<U> }
}
class Nil<T> extends List<T> { }
class Cons<T> extends List<T> {
    constructor(readonly head: T, readonly tail: List<T>) {
        super()
    }
}

// The abstract factory where the HKT is needed
class ListFactory<T> implements IList<typeof List> {
    Nil<T>(): IApp<typeof List, T> { return new Nil() }
    Cons<T>(head: T, tail: IApp<typeof List, T>): IApp<typeof List, T> {
        return new Cons(head, tail)
    }
}

рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреЗрдкрд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдФрд░ рдФрдЪрд┐рддреНрдп рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

https://blog.acolyer.org/2015/08/13/streams-a-la-carte-extensible-pipelines-with-object-algebras/

@metaweta , рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ Higher kinded types in TypeScript рддрд╛рдХрд┐ рдЗрд╕реЗ Google рдЦреЛрдЬ рд╕реЗ рдмреЗрд╣рддрд░ рджреГрд╢реНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ?

рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рдмреБрджреНрдзрд┐рдорд╛рди рдФрд░ рдкрд░реЛрдкрдХрд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВрдЯреЗрдирд░ (рдЬреИрд╕реЗ, @DanielRosenwasser ) рд╢реАрд░реНрд╖рдХ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдЙрдирдХреЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рдП?

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

рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛: "рд╕рдореБрджрд╛рдп" рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ "рдмреИрдХрд▓реЙрдЧ" рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкрджрд╛рд╡рдирдд рд╣реИ , рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрджреНрджрд╛ рд╕рдВрднрд╡рддрдГ рддрд░рд╣ рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЯреАрдПрд╕ рд╕рджрд╕реНрдп рдирд╣реАрдВ, рдмрд╕ рдХрд┐рд╕реА рдиреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ред

+1

рдпрд╣рд╛рдБ рдХреБрдЫ рд╣реИ рдЬреЛ рдореИрдВ рдмрд╕ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдорд╛рдорд▓рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдпрд╛ рддреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

type Identity<T> = T

interface DatabaseStorage<Wrap<T> extends Promise<T> | Identity<T>> {
    get(key: string): Wrap<any>
    set(key: string, value: any): Wrap<void>
}

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдЧрд╛!

@ccorcos thats рдХреЛ fp-ts рдХреЗ рд╕рд╛рде рд╢реБрджреНрдз рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/gcanti/fp-ts/blob/master/tutorials/mtl.ts рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

@mlegenhausen рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЙрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж рдПрдХ рдХрдард┐рди рд╕рдордп рд╣реИред

рдЬрдм рднреА рдореИрдВ fp-ts рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдЗрддрдиреА рдЬрдЯрд┐рд▓ рд╣реЛ рд░рд╣реА рд╣реИрдВ рдХрд┐ рд╡реЗ рднрдВрдЧреБрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИрдВред @pelotom рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ ...

рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд╣реАрдВ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

@ccorcos IMHO рддрдм рднреА рдЬрдм рдореИрдВрдиреЗ fp-ts рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА, рдореИрдВ MTL / tagless рд╢реИрд▓реА рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ред рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рднрд╛рд╡реА рдореЛрдирд╛рдб рдореЗрдВ рдЕрдореВрд░реНрддрддрд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдореЛрдирд╛рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЪреАрдЬреЗрдВ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдЬреЛ рдХреБрдЫ рдореИрдВ fp-ts рд╕рдореБрджрд╛рдп рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ async monad рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ (рдореИрдВ TaskEither рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛) рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдордЯреАрдПрд▓ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рднреА рдЖрдкрдХреЗ рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдЖрдкрдХреЛ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред fp-ts рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣рд╛рдЗрдкрд░-рдЯреАрдПрд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ MTL рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ред

рджрд┐рд▓рдЪрд╕реНрдк ... hyper-ts рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ ...

рдореИрдВ рдПрдл-рдмрд╛рдЙрдВрдб рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдЬреНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣рд▓реНрдХреЗ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛: https://github.com/strax/tshkt

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ (рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрдВрдбреАрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд┐рдВрдЧрд▓ рдХрдВрдбреАрд╢рдирд▓ рдЯрд╛рдЗрдк рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( ReturnType<<T>(value: T) => Array<T>> рд╕реЛрдЪреЛ)ред

рдпрд╣ рдЕрднреА рднреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдкреНрд░рдорд╛рдг рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ!

рдореИрдВ рдЙрд╕ @strax рдкрд░ рдПрдХ рдирдЬрд╝рд░

рдЗрд╕ рдмреАрдЪ, рдпрд╣рд╛рдБ рдПрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type Test1 = ╬╗<Not, [True]>;        // False
type Test2 = ╬╗<And, [True, False]>; // False
type Test3 = ╬╗<And, [True, True]>;  // True

// Boolean

interface True extends Func {
    expression: Var<this, 0>;
}

interface False extends Func {
    expression: Var<this, 1>;
}

interface Not extends Func {
    expression: ╬╗<Var<this, 0>, [False, True]>
}

interface And extends Func {
    expression: ╬╗<Var<this, 0>, [Var<this, 1>, Var<this, 0>]>
}

// Plumbing

type Func = {
    variables: Func[];
    expression: unknown;
}

type Var<F extends Func, X extends number> = F["variables"][X];

type ╬╗<Exp extends Func, Vars extends unknown[]> = (Exp & {
    variables: Vars;
})["expression"];

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

рдкреНрд░рд╕реНрддрд╛рд╡

рдЙрдЪреНрдЪ рдЖрджреЗрд╢, рд▓рдордбрд╛, рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░

рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░реЗрдВ

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

рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рд╕реЗ рджреЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рд▓реЗрддреЗред рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд╡ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░реЗрдВ

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк pipe рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдкрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдЗрдк-рд╕рдХреНрд╖рдо рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо pipe(...) рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

type  PipeSync<Fns  extends  Function[], K  extends  keyof  Fns> = 
    K  extends  '0'
    // If it's the first function, we leave it unchanged
    ?  Fns[K]
    // For all the other functions, we link input<-output
    : (arg:  Return<Fns[Pos<Prev<IterationOf<K & string>>>]>) =>
        Return<Fns[Pos<IterationOf<K & string>>]>;

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

type  Piper<Fns  extends  Function[]> = {
    [K  in  keyof  Fns]:  PipeSync<Fns, K>
}

( рдкреВрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВ )

рдЕрдм рд╣рдо рдПрдХ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:

declare  function  pipe<Fns  extends  F.Function[]>(...args:  F.Piper<Fns>):  F.Pipe<Fns>

const  piped  =  pipe(
    (name:  string, age:  number) => ({name, age}),
    (info: {name:  string, age:  number}) =>  `Welcome, ${info.name}`,
    (message:  object) =>  false, // /!\ ERROR
)

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВ! рд╣рдореЗрдВ рдПрдХ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

рдкреНрд░рдХрд╛рд░ '(рд╕рдВрджреЗрд╢: рд╡рд╕реНрддреБ) рдХрд╛ рддрд░реНрдХ => рдмреВрд▓рд┐рдпрди' рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ '(arg: string) => рдмреВрд▓рд┐рдпрди'ред

рд╕рдорд╕реНрдпрд╛

рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм рдпрд╣ рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЬреЗрдиреЗрд░рд┐рдХ (рдЯреЗрдореНрдкреНрд▓реЗрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ:

const  piped  =  pipe(
    (a:  string) =>  a,
    <B>(b:  B) =>  b, // any
    <C>(c:  C) =>  c, // any
)

type  piped  =  Piper<[
    (a:  string) =>  string,
    <B>(b:  B) =>  B,
    <C>(c:  C) =>  C,
]>
// [
//     (a:  string) =>  string,
//     (b:  string) =>  unknown,
//     (c:  unknown) => unknown
// ]

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рдЦреЛ рджреЗрддрд╛ рд╣реИред
> рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЙрдЪреНрдЪ рдХреНрд░рдо рдкреНрд░рдХрд╛рд░ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ <

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕

type  PipeSync<Fns  extends  Function[], K  extends  keyof  Fns> = 
    K  extends  '0'
    // If it's the first function, we leave it unchanged
+   ?  *(Fns[K]) // this will preserve the generics
    // For all the other functions, we link input<-output
+   :  *( // <- Any type can be made a reference
+       <T>(arg:  T) => Return<*(Fns[Pos<IterationOf<K  &  string>>])>
+       // vvv It is now a reference, we can assign generics
+       )<Return<*(Fns[Pos<Prev<IterationOf<K  &  string>>>])>>
+       // ^^^ We also tell TS not to evaluate the previous return
+       // and this could be achieved by making it a reference too

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдордиреЗ * рд╕рд╛рде рдЬреЗрдирд░рд┐рдХ рд░реВрдк рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЗрдирд░рд┐рдХ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ред рддреЛ * рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ * рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╣реИ:

  • рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ : рдпрд╣ рдЕрдкрдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд░рддрд╛ рд╣реИ / рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  • рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИ : рдпрд╣ рд╕рдВрджрд░реНрдн рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рддрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдПрдХ рд╕рдВрджрд░реНрдн рд╡реГрдХреНрд╖ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд░рд┐рдлрд░реЗрдиреНрд╕ рдХреЛ рдирд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╕рд╛рде рдКрдкрд░ рд╣реЛрддрд╛ рд╣реИ Return<*(Fns[Pos<Prev<IterationOf<K & string>>>])> рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ T ред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ * "рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдирд┐рдХрд╛рд╕реА рдХреЗ рдЦрд┐рд▓рд╛рдл" рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
  • рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ : рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ
type  piped  =  Piper<[
    (a:  string) =>  string,
    <B>(b:  B) =>  B
    <C>(c:  C) =>  C
]>
// [
//     (a:  string) =>  string,
//     (b:  string) =>  string,
//     (c:  string) =>  string
// ]

рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП / рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ (рдЕрдкреВрд░реНрдг рдЬреЗрдиреЗрд░рд┐рдХ)ред рдлрд┐рд▓рд╣рд╛рд▓, рдЯреАрдПрд╕ рдПрдХ рд╢реЙрдЯ рдореЗрдВ unknown рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЬреЗрдирд░рд┐рдХ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде, рдЬрдм рдХреБрдЫ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type  piped  =  Piper<[
    <A>(a:  A) =>  A, // ?
    <B>(b:  B) =>  B, // ?
    <C>(c:  C) =>  C, // ?
]>
// [
//     <A>(a:  A) =>  A,
//     (b:  A) =>  A,
//     (c:  A) =>  A
// ]

рд╡рд┐рд╡рд░рдг

* рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕рдХреА рдЬреЗрдирд░рд┐рдХ рдкрд░ рдЬреЛрдбрд╝рддреЛрдбрд╝ рд╣реЛ рд╕рдХрддреА рд╣реИред рддреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦрдиреЗ рд╕реЗ рдЗрд╕рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

*[type]

рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░рд┐рдХ рд╣реЗрд░рдлреЗрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ:

*[type]<T0, T1, T2...>

рдЬреЗрдирд░рд┐рдХ рдХреЗрд╡рд▓ рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЦрдкрдд / рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдпрд╣ рдХрд░:

*string<object, null> // Will resolve to `string`

рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рднреА рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЙрд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдЯреАрдПрд╕ рдХреЛ рдЗрд╕рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдпрд╣ рднреА рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ * рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЪреАрдЬрд╝ (рдЬреИрд╕реЗ C / C ++ рднрд╛рд╖рд╛рдУрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдзрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдкреНрд░рдХрд╛рд░

рдЕрдм рдЬрдм рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛: рд▓реИрдореНрдмреНрдбрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЙрд▓рдмреИрдХ, рд▓реИрдореНрдмреНрдбрд╛, рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рдорд╛рди рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

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

type  A<T  extends  string> = {0:  T}
type  B<T  extends  string> = [T]
type  C<T  extends  number> = 42

// Here's our lamda
type  Referer<*Ref<T  extends  string>, T  extends  string> =  Ref<T>
// Notice that `T` & `T` are not in conflict
// Because they're bound to their own scopes

type  testA  =  Referer<A, 'hi'> // {0: 'hi'}
type  testB  =  Referer<B, 'hi'> // ['hi']
type  testC  =  Referer<C, 'hi'> // ERROR

рдЙрдЪреНрдЪ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░

interface Monad<*T<X extends any>> {
  map<A, B>(f: (a: A) => B): T<A> => T<B>;
  lift<A>(a: A): T<A>;
  join<A>(tta: T<T<A>>): T<A>;
}

рдЦреЛрдЬ рд╢рдмреНрдж

рдЙрдЪреНрдЪ # рдореЛрдб # рдЯрд╛рдЗрдк #references # рд▓реЗрдореНрдмрдбрд╛ #HKTs

@ рдкрд┐рд░рд┐рдХреНрд╕-рдЬреАрдПрдЪ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рдВрджреЗрд╢ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЬреЛ рдорд╛рдВрдЧрддреЗ рд╣реИрдВ, рд╡рд╣ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдВрдЧрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рд╛, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдиреЗ (рдПрдХ-рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП) рдХрд┐рдпрд╛, рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Pipe рдПрдХ рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ (рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рдереАрдВ)ред

рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди?

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

interface Monad<T<X>> {
    map1<A, B>(f: (a: A) => B): (something: A) => B;

    map<A, B>(f: (a: A) => B): (something: T<A>) => T<B>;

    lift<A>(a: A): T<A>;
    join<A>(tta: T<T<A>>): T<A>;
}

type sn = (tmp: string) => number

function MONAD(m: Monad<Set>,f:sn) {
    var w = m.map1(f);    // (method) Monad<Set>.map1<string, number>(f: (a: string) => number): (something: string) => number
    var w2 = m.map(f);    // (method) Monad<Set>.map<string, number>(f: (a: string) => number): (something: Set<string>) => Set<number>
    var q = m.lift(1);    // (method) Monad<Set>.lift<number>(a: number): Set<number>
    var a = new Set<Set<number>>();
    var w = m.join(q);    // (method) Monad<Set>.join<unknown>(tta: Set<Set<unknown>>): Set<unknown>.  You could see that typeParameter infer does not work for now.
    var w1 = m.join<number>(q);    // (method) Monad<Set>.join<number>(tta: Set<Set<number>>): Set<number>
}

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рдЕрднреА рднреА рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ: quickinfo рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рдЯрд╛рдЗрдк рдХрд░реЗрдВрдкрд╛рд░реНрдЯреАрдлрд╝рд╛рдпрд░, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ, рд╣рд╛рдИрд▓рд╛рдЗрдЯ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдкрдХрд░реНрддрд╛ред .....
рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рд╡рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЕрднреА рддрдХ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ @millsp https://github.com/microsoft/TypeScript/issues/1213#issuecomment -523245130 рд╕реЗ рд╣реИ, рдирд┐рд╖реНрдХрд░реНрд╖ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдВрдкреНрд░реЗрд╖рдг рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдпрд╣ рдПрдЪрдХреЗрдЯреА / рдлрдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ / рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдореАрдард╛ рд╣реЛрдЧрд╛ (рдЬрдм рдореИрдВ lambda рдХрд╣рддрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрдгрд┐рдд, рдореИрдВ рдХреЗрд╡рд▓ рдЧрдгрд┐рдд рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ)

рдпрд╣рд╛рдВ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореЗрд░реА рдмрд╣реБрдд рдорджрдж рдХрд░рддреА рд╣реИрдВ:

  • http://adriaanm.github.io/files/higher.pdf

    • рдЗрд╕ рдкреЗрдкрд░ рдореЗрдВ BNF рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдмрджрд▓реЗрдВред

@ShuiRuTian рдЙрд╕ m.join(q) Set<unknown> рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ --noImplicitAny рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдХрд┐ рдЪреЗрддрд╛рд╡рдиреА рднреА рдЫреЛрдбрд╝ рджреЗрдВ?

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

рдпрд╣ рдПрдЪрдХреЗрдЯреА / рдлрдВрдХреНрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ / рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдореАрдард╛ рд╣реЛрдЧрд╛ (рдЬрдм рдореИрдВ lambda рдХрд╣рддрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрдгрд┐рдд, рдореИрдВ рдХреЗрд╡рд▓ рдЧрдгрд┐рдд рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ)

рдХрд┐рд╕реА рднреА рдЖрдЧреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд░реА filter рдлрдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛рдП:

const filterNumbers = filter(
    (item: number | string): item is number => typeof item === "number"
);

const array = ["foo", 1, 2, "bar"]; // (number | string)[]
const customObject = new CustomObject(); // CustomObject<number | string>

filterNumbers(array); // number[] inferred
filterNumbers(customObjectWithFilterFunction); // CustomObject<number> inferred

рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП "рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реМрдЯрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде"ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

const filter = <Item, FilteredItem>(predicate: (item: Item) => item is FilteredItem) =>
  <Filterable<~>>(source: Filterable<Item>): Filterable<FilteredItem> => source.filter(predicate);

@lukeshiru рд╣рд╛рдБ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдпрд╣ https://pursuit.purescript.org/packages/purescript-filterable/2.0.1/docs/Data.Filterable#v : рдлрд╝рд┐рд▓реНрдЯрд░ рд╣реИ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдЪрдХреЗрдЯреА рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рдмрд╣реБрдд рд╕рд╛рд░реЗ рдпреВрдЬреЗрд╕ рд╣реИрдВред

@isiahmeadows рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛ред рддреБрдо рд╕рд╣реА рд╣реЛред
@lukeshiru рдФрд░ @raveclassic рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдЧреВрдВрдЬрдиреАрдп рд▓рдЧрддреА рд╣реИред Https://gcanti.github.io/fp-ts/learning-resource/ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕ рдкрд░ рдореЗрд░реА рдирдЬрд╝рд░ рд╣реЛрдЧреА

рдореИрдВ рдЕрдЯрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди т╕ШworkaroundтА╜ рд╣реИ рдХреНрдпрд╛ ...
рдореИрдВ рдЪреЗрди рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

m['fantasy-land/chain'](f)

рдПрдХ рдорд╛рди рдЬреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рднреА рд▓рд╛рдЧреВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

a['fantasy-land/ap'](b)

рдореИрдВрдиреЗ FunctorSimplex рдХрд┐рдпрд╛, рдЬреЛ рдмрд╛рдж рдореЗрдВ FunctorComplex рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛, рдлрд┐рд░ Apply рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ Apply Chain Apply рд░реВрдк рдореЗрдВ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ Chain рдпрд╣ рдЯреВрдЯ рд░рд╣рд╛ рд╣реИ ...

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдиреАрдЪреЗ рдЫрд╡рд┐ рдФрд░ рдХреЛрдб рд╕реЗ рд▓рд┐рдВрдХ):

(рдореБрдЭреЗ ApType рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд╛рдЗрди 12 Apply ┬лрд╣рд╛рд░реНрдбрдХреЛрдб┬╗ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╣реИ ... рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ IApply рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

Screenshot

7ff8b9c рдореЗрдВ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ

`` `рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░ ApType = ( рдПрдкреА: рд▓рд╛рдЧреВ рдХрд░реЗрдВ <(рд╡реИрд▓: рдП) => рдмреА>, ) => IApply ;

/ * [...] * /

рдирд┐рд░реНрдпрд╛рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IApply рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ FunctorComplex {
/ ** Fantasy-land/ap :: Apply f => f a ~> f (a -> b) -> f b * /
рдПрдкреА: рдПрдкрд╛рдЗрдк ;
}
`` `

рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕рдорд╕реНрдпрд╛: рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЖрд╡рд╢реНрдпрдХ

@ рд▓рдХреНрд╕ рдХреИрд▓реНрд╢рд┐рдпрдо рдЬрдм рддрдХ рдЯреАрдПрд╕ рдХреЛ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдиреБрдХрд░рдг рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

  • https://github.com
  • https://gcanti.github.io/fp-ts/ - рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ TS рдореЗрдВ рдореБрдЦреНрдп рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП FP рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
  • https://www.cl.cam.ac.uk/~jdy22/papers/lightweight-higher-kinded-polymorphism.pdf - рдПрдХ рдкреЗрдкрд░, рдЬреЛ fp-ts рдФрд░ matechs- рдЗрдлрд╝реЗрдХреНрдЯ (alt fp-ts) рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдереЛрдбрд╝рд╛ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг IIRC)

рдЬрдм рддрдХ рдЯреАрдПрд╕ рдХреЛ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рддрдм рддрдХ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреБрдХрд░рдг рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ

рдЯреИрдВрдХ рдмрд╣реБрдд рд╕рд╛рд░реЗ @kapke рд╢рд╛рдпрдж рдореИрдВ FP theses рджрд┐рдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реВрдВ рдФрд░ рдЪреВрдВрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╣рдо pseudoFnAdd(15)(27) // 42 рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде, pseudoType<someClassOrConstructor><number> // unknown рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛рди (рд░реАрдбрд┐рдВрдЧ) рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ ...

рдиреЛрдЯ: рдореИрдВ рдлреНрд░реЗрдВрдЪ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдВ, рдлреНрд░реЗрдВрдЪ рдореЗрдВ рд╢рдмреНрдж _lecture (s) _ рдХрд╛ рдЕрд░реНрде _реНрд░реЗрдбрд┐рдВрдЧ_ рд╣реИ рдФрд░ 'рдХрд┐рд╕реА рдХреЛ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рджреА рдЧрдИ рдЧреБрд╕реНрд╕рд╛ рдпрд╛ рдЧрдВрднреАрд░ рдмрд╛рдд' рдирд╣реАрдВ ...

рд╕рдВрднрд╡рддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореИрдВ рдкреАрдЖрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛ рдерд╛, рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ:

type AGenericType<T> = T[];

type Placeholder = {'aUniqueKey': unknown};
type Replace<T, X, Y> = {
  [k in keyof T]: T[k] extends X ? Y : T[k];
};

interface Monad<T> {
  map<A, B>(f: (a: A) => B): (v: Replace<T, Placeholder, A>) => Replace<T, Placeholder, B>;
  lift<A>(a: A): Replace<T, Placeholder, A>;
  join<A>(tta: Replace<T, Placeholder, Replace<T, Placeholder, A>>): Replace<T, Placeholder, A>;
}

function MONAD(m: Monad<AGenericType<Placeholder>>, f: (s: string) => number) {
  var a = m.map(f); // (v: string[]) => number[]
  var b = m.lift(1); // number[]
  var c = m.join([[2], [3]]); // number[]
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

weswigham picture weswigham  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

uber5001 picture uber5001  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

seanzer picture seanzer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manekinekko picture manekinekko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dlaberge picture dlaberge  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
bleepcoder.com рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рджреБрдирд┐рдпрд╛ рднрд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд GitHub рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо GitHub, Inc. рдпрд╛ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП GitHub рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд┐рд╕реА рднреА рд╡реАрдбрд┐рдпреЛ рдпрд╛ рдЪрд┐рддреНрд░ рдХреА рдореЗрдЬрдмрд╛рдиреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдЕрдзрд┐рдХрд╛рд░ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд╣реИрдВред
рдЗрд╕ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕: рд╕реНрд░реЛрдд

рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ
рд▓реЛрдХрдкреНрд░рд┐рдп рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ
рдЕрдзрд┐рдХ рдЧрд┐рдЯрд╣рдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ

┬й 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.