рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рднреА рдорда рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдореИрдВ рд▓реЗрдЦрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ
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<~>> { ... }
рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдЙрдкрдирд╛рдореЛрдВ рдХреА рд╕рдорд╛рдирддрд╛рдПрдВ рдЯрд╛рдЗрдкрд┐рдбрд┐рдл рдХреЗ рд╡реИрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд┐рд╕реА рднреА рджрд╛рдиреЗ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╢рд╛рдпрдж рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ
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 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рддрд▓рдирд╛, рдЬреЛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдбрд╝рд╛ рдордЫрд▓реА рд╣реИ:
bind
, call
, рдФрд░ apply
, рдореВрд▓ JS рдлрд╝рдВрдХреНрд╢рди, рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реИрд░реЗрдбрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред Object.assign
рднреА рдЗрд╕реА рддрд░рд╣ рдХреЗ рдлрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рдЕрдХреЗрд▓реЗ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред_.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
рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
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
рдореЗрдВ рдирд┐рдореНрди рдЙрдЪреНрдЪ рдХреНрд░рдо рдЖрдХрд╛рд░ рд╣реИ:
(* => *, (*,*) => *) => *
рддрдм рдореИрдВрдиреЗ рдЙрдЪреНрдЪ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдмрд╕реЗ рдкреВрд░реНрдг рдирд┐рд░реВрдкрдг рдХреА рдЬрд╛рдВрдЪ рдХреА рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реНрд╡реЛрдХреНрдд рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░:
(* => (*,*)) => ((*,*) => *)
рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реАрдзреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рд╕реНрдкрд░ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ, рддреЛ рд╣рдо рдХрднреА рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ *
рдЕрд░реНрде рдЬрдореАрди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд╛рдХреНрд╖рд╕реА рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ - рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде) рд╣рдореЗрд╢рд╛ рдПрдХ рдЬрдореАрдиреА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдорд┐рдд рд╣реЛрддреА рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЙрд╕реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдерд╛ рдХрд┐ рдореИрдВ рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
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
рдХреЗ рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрд░реНрдерд╛рдд * -> *
(рдпрд╛ рд╢рд╛рдпрдж * => *
, =>
рдмрд╛рдж рд╕реЗ
~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
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
- (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
- (b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдкрд░рд┐рдорд╛рдг рдХреЗ рд▓рд┐рдП
TтВБ, TтВВ, ...
~A
,A<TтВБ, TтВВ, ...>
B<TтВБ, TтВВ, ...>
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреА рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред
рд╡рд░реНрдЧ MySpecialPromise рдХреЗ рд╡рд╛рджреЗ PromiseLike {} рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, ~MySpecialPromise
~PromiseLike
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВред
рд╡рд░реНрдЧ MyArrayPromise рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред
(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;
}
рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХрдИ рдкреНрд░реЗрд░рдгрд╛рдПрдБ рд╣реИрдВ:
~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>;
}
рдлрд┐рд░ рдЖрдк рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рднреАрддрд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рд╡рд╢ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдПрдХ рдореИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╢рдХреНрддрд┐ рд╣реЛрдЧреАред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХреЗ рдХрдИ рдореБрджреНрджреЗ рд╣реЛрдВрдЧреЗ:
((* => *) => *) => *
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рд╕рднреА рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд░реНрдЧ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдиреАрд▓рдордгрд┐ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред@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
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
- (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
- (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
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП:
- (a) рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рддрд░рд╣ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (arity рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдбрд╝рдЪрди рдирд╣реАрдВ)ред
- (b) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдиреВрдиреА рдорд╛рдкрджрдгреНрдб рдХреЗ рд▓рд┐рдП
TтВБ, TтВВ, ...
~A
,A<TтВБ, TтВВ, ...>
B<TтВБ, TтВВ, ...>
рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╛рдирдЪрд┐рддреНрд░рдг рдмрд╛рдд ... рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдмреЗрд╡рдХреВрдл рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ MyPromise<T> extends Promise<T[]>
рдФрд░ ~Promise
рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдХреЛрдИ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рдирд┐рдпрдо рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ ~Promise
рд╕рдорд╛рди рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, ~
рдХреЛ "рдСрдкрд░реЗрдЯрд░ рдХреА рдЯреАрд╕реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ" рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдИ рдХрд╛рд░рдг рдмрддрд╛рдП рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИ:
Promise
рд▓рд┐рдЦрддрд╛ рд╣реИ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрд┐рд▓рдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ рдЬреИрд╕рд╛ рдЕрднреА рд╣реИред рдЯреАрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред~\w
рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЙрд╕реЗ рдЯреАрд╕реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЕрдкрдиреА рд░рд╛рдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдУрд╡рд░рд▓реЛрдбреЗрдб / рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреЙрд░реНрдо * & (* => *)
, * | (* => *)
, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдиреВрдиреА рд╣реИрдВ? рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧ рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рдмреБрд░реЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдард┐рди рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП * | (* => *)
рддрд╛рдХрд┐ рдЖрдк рдЙрд╕рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрднреА рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рд╣реИ:
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>;
рдХреНрдпрд╛ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд░реЛрдХрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреНрдпрд╛ рдРрд╕реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдЯреАрд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рджреЗрддрд╛ рд╣реИ:
~<A>Map<string, A>
, ~<A, B>Map<B, A>
, рдФрд░ рдЗрд╕реА рддрд░рд╣редрдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЯреАрд╕реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкрд╣рд▓реЗ рдкреАрдЖрд░ рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдлреАрдЪрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
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 рдореБрдЭреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рд▓рдкрдЯ рдкрд╕рдВрдж рд╣реИред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рджреЛ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХреБрдЫ рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХреЛ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕рдорд╛рдзрд╛рди рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдПрдлрд┐рд▓ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдЯрд╛ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
https://gist.github.com/mlhaufe/089004abd14ad8e7171e2a122198637f
рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдордзреНрдпрд╡рд░реНрддреА рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рднрд╛рд░реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рд╕-рдлреИрдХреНрдЯрд░реА рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд┐рдХреНрд╕рд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдлреА рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
# 17588 рдкрд░ рдХреБрдЫ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
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>;
}
@ рдкрд┐рд░рд┐рдХреНрд╕-рдЬреАрдПрдЪ рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕рдВрджреЗрд╢ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЬреЛ рдорд╛рдВрдЧрддреЗ рд╣реИрдВ, рд╡рд╣ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдВрдЧрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рд╛, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ рд╣рд░ рдХрд┐рд╕реА рдиреЗ (рдПрдХ-рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП) рдХрд┐рдпрд╛, рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ 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
рдХрд╣рддрд╛ рд╣реВрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧрдгрд┐рдд, рдореИрдВ рдХреЗрд╡рд▓ рдЧрдгрд┐рдд рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ)
рдпрд╣рд╛рдВ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореЗрд░реА рдмрд╣реБрдд рдорджрдж рдХрд░рддреА рд╣реИрдВ:
@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
рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд╛рдЗрди 12Apply
┬лрд╣рд╛рд░реНрдбрдХреЛрдб┬╗ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╣реИ ... рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛIApply
рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
7ff8b9c рдореЗрдВ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ
`` `рдЯрд╛рдЗрдкрдкреНрд░рддрд┐
рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░ ApType = ( рдПрдкреА: рд▓рд╛рдЧреВ рдХрд░реЗрдВ <(рд╡реИрд▓: рдП) => рдмреА>, ) => IApply ;
/ * [...] * /
рдирд┐рд░реНрдпрд╛рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IApply рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ FunctorComplex {
/ ** Fantasy-land/ap :: Apply f => f a ~> f (a -> b) -> f b
* /
рдПрдкреА: рдПрдкрд╛рдЗрдк ;
}
`` `
рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕рдорд╕реНрдпрд╛: рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЖрд╡рд╢реНрдпрдХ
@ рд▓рдХреНрд╕ рдХреИрд▓реНрд╢рд┐рдпрдо рдЬрдм рддрдХ рдЯреАрдПрд╕ рдХреЛ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ, рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдиреБрдХрд░рдг рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
рдЬрдм рддрдХ рдЯреАрдПрд╕ рдХреЛ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рддрдм рддрдХ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреБрдХрд░рдг рд╕рдВрднрд╡ рд╣реИред рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ
рдЯреИрдВрдХ рдмрд╣реБрдд рд╕рд╛рд░реЗ @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[]
}
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдПрдЪрдХреЗрдЯреА рдХреА рдорд╛рдирд╕рд┐рдХрддрд╛ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрддреЛрдВ рдХреЛ рддреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦреЛрдИ рд╣реБрдИ рдкреАрдврд╝рд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреАрд╡рди рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдмрд╛рдд рд╣реЛрдЧреА рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЕрд╢рдХреНрдд рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд, рдпрд╣ рд╕рдм рдХреБрдЫ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ
рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЗрдВ, рдРрд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рдмрд╛рдд рд╕реБрдиреЗрдВ, рдЬреЛ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдШреЛрдбрд╝реЗ рдХреА рдорд╛рдБрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдл * рдЬреА рдлреЗрд░рд╛рд░реА рджреЗрдВ