Typescript: рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ / рдХреЙрд▓ рдЯрд╛рд░рдЧреЗрдЯ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдорд┐рд╕рдореИрдЪ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЕрдЧре░ 2015  ┬╖  55рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ / рдХреЙрд▓ рдЯрд╛рд░рдЧреЗрдЯ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдорд┐рд╕рдореИрдЪ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛:

function foo(x: number, y: number, z: number) { }
var args = [0, 1, 2];
foo(...args);

рдпрд╣ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

Supplied parameters do not match any signature of call target.

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

@ jpike88 рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдЙрддреНрдкрд╛рджрдХ рд╣реИрдВред рдореБрджреНрджрд╛ рдЙрдирдХреЗ TODO рдореАрд▓ рдХреЗ рдкрддреНрдерд░ 2.7 рдпрд╛ 2.8 рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╣ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЬрд╛рд░реЛрдВ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред рдЕрдкрдиреЗ рд╡реЛрдЯ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ your рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рдж рдореБрдлреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдФрд░ рд╡реЗ рд╣рдореЗрдВ рдХреБрдЫ рднреА рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░рд╛ рд▓реЗрдирд╛ рд╣реИ, рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдХреА рддрд░рд╣ рдЖрдк ЁЯХ║

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

рдФрд░ рдРрд╕рд╛ рд╣реА рддрдм рд╣реИ рдЬрдм args any -рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ

function foo(x: number, y: number, z: number) { }

function bar(...args) {
    foo(...args); // Supplied parameters do not match any signature of call target.
}

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@smashdevcode , @tjoskar , рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХреНрдпрд╛ рдЖрдк рд╕рд░рдгрд┐рдпреЛрдВ рдпрд╛ рдЯреНрдпреВрдкрд▓реНрд╕ (рдпрд╛ рджреЛрдиреЛрдВ рд╢рд╛рдпрдж) рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдпрд╣рд╛рдБ рдЦрд┐рд▓реМрдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:

//// arrays ////
var a1: number[] = [1,2];
var a2: number[] = [1,2,3];
var a3: number[] = [];
function twoNumbersOrSo(n?: number, m?: number) {
  return (n || -1) * (m || -1);
}
function howManyNumbersLessOne(n?: number, ...ns: number[]) {
    return ns.length;
}

//// tuples ////
var t1: [number, string] = [1, "foo"];
var t2: [number, string, string] = [1, "foo", "bar"];
function veryTraditional(n: number, s: string) {
    for (let i = 0; i < n; i++) {
        console.log(s);
    }
}
function moreInteresting(n: number, s: string, ...rest: string[]) {
    veryTraditional(n, s);
    console.log(rest);
}

рдЕрдм a1,a2,a3 рдХреЛ рдкрд╣рд▓реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ t1,t2 рдХрд┐рд╕реА рднреА рджреВрд╕рд░реЗ рджреЛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:

  1. рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ any ред)
  2. рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдкреНрд░рд╕рд╛рд░ рддрд░реНрдХ рдХреЛ рдЕрдВрддрд┐рдо (рдЬреИрд╕реЗ рдЖрдЬ) рд╣реЛрдирд╛ рд╣реИред

рдЯреБрдкрд▓реНрд╕ рдХреЗ рд╕рд╛рде:

  1. рдорд╛рди рдХреЛ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рдПрдЧреА (рдЬреИрд╕реЗ (number | string)[] рди [number, number, string] )ред рдЦрд┐рд▓реМрдирд╛ рдХреЛрдб рдореЗрдВ рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрдЪрдд рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рд▓рдВрдмрд╛рдИ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдиреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЯрдкрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдп @sandersn ,

рджреЗрд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореИрдВ рдЖрдкрдХреЗ рдЬрд╡рд╛рдм рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЪреВрдХ рдЧрдпрд╛ред
рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛рдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЯрдкрд▓-рд╕рдВрд╕реНрдХрд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓реНрд╕ рдореЗрдВ рдлреИрд▓рд╛ рд╣реБрдЖ рдСрдкрд░реЗрд╢рди рдХрд┐рд╕реА рднреА рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред map рдФрд░ set , рдФрд░ рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдбреЗрдЯрд╛ рдореЗрдВ рдХрдИ рдбреЗрдЯрд╛рдЯрд╛рдЗрдкреНрд╕ рд╣реЛрдВ (рдЬреИрд╕реЗред рдирдпрд╛ рд╕реЗрдЯ () рдЬреЛрдбрд╝реЗрдВ (1)ред .add ( 'рд╕реНрдЯреНрд░рд┐рдВрдЧ'))ред рд▓реЗрдХрд┐рди рд╡рд╣ рд╢рд╛рдпрдж рдПрдХ рдФрд░ рдЯрд┐рдХрдЯ рд╣реИ?

Set рдФрд░ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрд╢рди (Chrome 46 рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг

function foo(...args) {
    console.log(...args);
}
var bar = new Set().add(1).add(2);

foo(...bar); // 1, 2

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

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдЬ рд╕реБрдмрд╣ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ [email protected] рдФрд░ http://www.typescriptlang.org/Playground рдкрд░ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рддрдерд╛рдкрд┐,
рдореИрдВ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛
рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ; рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ
рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдХрд▓рдХ рд╣реИ
рдХреЗрд╡рд▓ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ "рд╕реНрдкреНрд░реЗрдб-рд╡реИрд░рд┐рдПрдмрд▓" рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛ []

function fun1(x: number, y: number, z: number) {
    return x+y+z;
}

let arr1 = [1, 2, 3];
let arr2 = [1, 2];

fun1(...arr1);
fun1(...arr2); // OK since `arr2`┬аis number[]
fun1(1, 2); // Should cause an error

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ?

рдирд┐рдореНрди рдХреЛрдб рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

function fun1(...num) {
    return Math.max(...num);
}

function fun2(a1, ...num) {
    return Math.max(...num);
}

function fun3(a1, ...num) {
    return fun1(...num);
}

let arr = [1, 2, 3];

if (Math.random() < .5) {
    arr.push(1);
}

fun1(...arr);
fun2('first param', ...arr);
fun3('first param', ...arr);

рд╢рд╛рдпрдж рдПрдХ рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдг (рдЬреЛ рдЖрдЬрдХрд▓ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):

const doSomeWork = ({title, genre, runtime}) => { console.log(title, genre, runtime); };

function fun1(...num) {
    num.forEach(doSomeWork);
}

const data = [{
    title: 'title',
    genre: ['action', 'drama'],
    runtime: 100
}];

fun1(...data);

: +1: рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдкрд░, Date рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ:

let dateNumberArray: Array<number> = [2015,11,11];
let myNewDate = new Date(...dateNumberArray);

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЖрдзрд╛рд░ рдРрдк рдореЗрдВ argv рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

{
  "yargv": [
    [
      "path",
      {
        "demand": true,
        "describe": "Source",
        "default": ".",
        "alias": "p"
      }
    ]
  ]
}
get appArgs() : { yargv: Array<Array<any>>, chdir: Array<boolean | string> } {
  return require(
    "../args.json"
  )
}

argv() : Promise<{}> {
  return new Promise((resolve) => {
    this.appArgs.yargv.forEach(v => yargs.option(...v))
    return resolve(yargs.usage("$0 [args]").help("h").
      alias("h", "help").argv)
  })
}

рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг https://github.com/ReactiveX/rxjs рдХреЗ рдХрдореНрдмрд╛рдЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрд╣рд╛рдВ рдореИрдВ this рдореВрд▓реНрдп рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрдм рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ projectFn рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдХреА рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд░реНрдХреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░реЗрдВред

getCombination() {
    return this.firstObservable
      .combineLatest(this.secondObservable, (...args) => this.projectFn(...args)));
  }

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореБрдЭреЗ рдХрд░рдирд╛ рд╣реИ

getCombination() {
    return this.firstObservable
      .combineLatest(this.secondObservable, (...args) => this.projectFn.apply(this, args)));
  }

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

import { merge } from 'lodash';

...
return merge(...arrayOfObjects);

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ; рд╣рдо рдЗрд╕ рддрд░рд╣ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

return Observable
      .forkJoin(a, b)
      .map(([current, past]) => this.mergeData(current, past));

рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдореЗрдВ:

return Observable
      .forkJoin(a, b)
      .map(data => this.mergeData(...data));

рд▓реЗрдХрд┐рди рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмреЗрдореЗрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг

class Parent {
    constructor(a, b, c){

    }
}

class Child extends Parent {
    constructor(d, ...args) {
        super(...args);
    }
}

TS2346: рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрд▓ рд▓рдХреНрд╖реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рднрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛:

listen(port: number, hostname?: string, backlog?: number, listeningListener?: Function): Server;
listen(port: number, hostname?: string, listeningListener?: Function): Server;
listen(port: number, backlog?: number, listeningListener?: Function): Server;
listen(port: number, listeningListener?: Function): Server;
listen(path: string, backlog?: number, listeningListener?: Function): Server;
listen(path: string, listeningListener?: Function): Server;
listen(options: ListenOptions, listeningListener?: Function): Server;
listen(handle: any, backlog?: number, listeningListener?: Function): Server;
listen(handle: any, listeningListener?: Function): Server;

рдЬрдмрдХрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

myListen(...args) {
    listen(...args);
}

рддрдм: _ [ts] рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рдирджрдВрдб рдХреЙрд▓ рд▓рдХреНрд╖реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ ред_

рддреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ:

export type DateProp = Date | (string|number)[];

const setDate = (value: DateProp): Date => (
    isDate(value) ? value : new Date(...value)
);

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ:

рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирджрдВрдб рдХреЙрд▓ рд▓рдХреНрд╖реНрдп рдХреЗ рдХрд┐рд╕реА рднреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВред

рднрд▓реЗ рд╣реА рдорд╛рди рдореЗрдВ рд╕рд╣реА рдбреЗрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди

рднрд▓реЗ рд╣реА рдорд╛рди рдореЗрдВ рд╕рд╣реА рдбреЗрдЯ рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди

рдпрд╣ рд╕рд╣реА рд╣реИ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдорд╛рд░рд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдореИрдВ рдПрдХ рдирдпрд╛ рдирд╛рдо рджрд┐рдпрд╛ .js рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ .ts ред рдХрд┐рд╕реА рднреА рддрд░рд╣, "рд╕рднреА рд╡реИрдз рдЬреЗрдПрд╕ рд╡реИрдз рдЯреАрдПрд╕ рдирд╣реАрдВ рд╣реИ" рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред

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

import {css} from 'styled-components';

export const Breakpoints = {
    tablet: 580,
    desktop: 800,
};

export type BreakpointLabels = keyof typeof Breakpoints;

export const media = Object.keys(Breakpoints).reduce((mediaQueries, label: BreakpointLabels) => (
    {
        ...mediaQueries,
        [label]: (...args: any[]) =>
            css`
                <strong i="7">@media</strong> (max-width: ${Breakpoints[label]}px) {
                    ${css(...args)}
                      ^^^^^^^^^^^^ Supplied parameters do not match any signature of call target.
                }
            `
    }
), {});

рдореЗрд░рд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб css.call , рдЬреЛ рдХрдо рд╕реЗ рдХрдо any[] -typed args рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

import {css} from 'styled-components';

export const Breakpoints = {
    tablet: 580,
    desktop: 800,
};

export type BreakpointLabels = keyof typeof Breakpoints;

export const media = Object.keys(Breakpoints).reduce((mediaQueries, label: BreakpointLabels) => (
    {
        ...mediaQueries,
        [label]: (...args: any[]) =>
            css`
                <strong i="13">@media</strong> (max-width: ${Breakpoints[label]}px) {
                    ${css.call(this, ...args)}
                }
            `
    }
), {});

рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛, рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдореВрд▓ рд╡рд┐рд▓рдп рдХрд╛рд░реНрдп рд╣реИ:

merge(target: T, ...sources: T[])

рдХреНрдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐ рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рдореНрдпреВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпреЛрдВ рдЗрд╕ ES6 рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдпрд╛ рдХрд┐рд╕реА рднреА рдпреЛрдЬрдирд╛ рд╕реЗ рддреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред @mhegazy рдХреГрдкрдпрд╛ рдХрдореЗрдВрдЯ рдХрд░реЗ

рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЙрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдлреИрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╕рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/Microsoft/TypeScript/pull/15849)ред рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдирдВрдд рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдХрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИ:

declare var args: number[];

function foo(x?: number, y?: number, z?: number) { }
foo(...args);     // OK
foo(2, ...args);  // OK

function bar(...args: number[]) { }
bar(...args);     // OK
bar(2, ...args);  // OK

function baz(x: number, y: number, z: number) { }
baz(...args);     // still not allowed

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ args рдЖрд╡рд╢реНрдпрдХ baz рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ args рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рд╡реИрдзрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

function baz(x: number, y: number, z: number) { }
var tuple: [number, number, number] = [1, 2, 3];
baz(...tuple);     // should be allowed

рдореБрдЭреЗ @devrelm рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

рдореБрдЭреЗ рдЕрднреА рднреА рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

class A {
    constructor(message: string, test?: any) {
        console.log('A constructor called');
    }
}

class B extends A {
    constructor(...spread) {
        super('a', ...spread);
    }
}

рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

@owlcode рдпрд╣ рдЯреАрдПрд╕ 2.4 рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди 2.4 рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рдж рдЯреАрдПрд╕ 2.3 рдкрд░ рд╣реИред

рдпрд╣ рдЯреАрдПрд╕ 2.4 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ,

export function log(...args: any[]) {
    console.log(...join(args.map(formatDevTools),' '));
}

рд╣рд╛рд▓рд╛рдБрдХрд┐, TS 2.4 рдореЗрдВ рдПрдХ рдирдпрд╛ рдмрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

TS2461: рдЯрд╛рдЗрдк рдХрд░реЗрдВ 'Iterable'рдХреЛрдИ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп ( [...obj] ) рдлреИрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдЕрднреА рддрдХ 2.4.1-insiders.20170615 рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдмрдЧ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдЬрд┐рд╕реЗ рдореИрдВ рдЕрднреА рддрдХ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реВрдВред

рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ any[] рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред


рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рд╣рдо Console рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,

interface _Console {
    assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
    clear(): void;
    count(countTitle?: string): void;
    debug(...optionalParams: any[]): void;
    dir(value?: any, ...optionalParams: any[]): void;
    dirxml(value: any): void;
    error(...optionalParams: any[]): void;
    exception(message?: string, ...optionalParams: any[]): void;
    group(groupTitle?: string): void;
    groupCollapsed(groupTitle?: string): void;
    groupEnd(): void;
    info(...optionalParams: any[]): void;
    log(...optionalParams: any[]): void;
    msIsIndependentlyComposed(element: Element): boolean;
    profile(reportName?: string): void;
    profileEnd(): void;
    select(element: Element): void;
    table(...data: any[]): void;
    time(timerName?: string): void;
    timeEnd(timerName?: string): void;
    trace(...optionalParams: any[]): void;
    warn(...optionalParams: any[]): void;
}

рдФрд░ рдлрд┐рд░ console рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд╛рд▓реЗрдВ:

export function log(...args: any[]) {
    (console as _Console).log(...join(args.map(formatDevTools),' '));
}

рд╡рд╣ рдЕрдм рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП # 18004 рдкрд░ рдПрдХ PR рдЦреЛрд▓рд╛ред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрдкрдиреЗ tsconfig рдореЗрдВ "noStrictGenericChecks" рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЕрдкрдиреЗ tsconfig рдореЗрдВ "noStrictGenericChecks" рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЗрд╕ рдмрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ ...

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕ рдмрдЧ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

@mhegazy рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рддрд░реНрдХреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ (рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ)

рдпрд╣ --noStrictGenericChecks рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдХреГрдкрдпрд╛ https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#stricter -checking-for-generic-functions рджреЗрдЦреЗрдВ

рдореИрдВ рдмрд╕ рдЗрд╕ рдкрд╛рд░ рднрд╛рдЧрд╛ред

рдЬрдмрдХрд┐ рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХрдо рд╕реЗ рдХрдо "рдЕрдзрд┐рдХ" рддрд░реНрдХ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ @sandersn рд╣рдо рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ foo(value, ...otherValues) рддрд░рд╣ рдХреБрдЫ рдХрд░ рд░рд╣реЗ рдереЗ, рдЙрдиреНрд╣реЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрддрд░рдирд╛рдХ рд▓рдЧрддрд╛

declare const foo: (value: string) => string;

foo('bar', 'qat'); // Expected 1 arguments, but got 2.

foo('bar', ...['qat']); // No error

@kitsonk рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдмрдЧ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдФрд░ рд╕рдВрднрд╡рддрдГ рдореМрдЬреВрджрд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЯрд┐рд▓ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдореЛрдбрд╝ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рддрдм рднреА рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

function myFunc(...args: any[]) {
  if(args.length > 0) {
    otherFunc(...args)
  }
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рднреНрд░рдо рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ:

2 рддрд░реНрдХ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо 0 рдорд┐рд▓рд╛ рд╣реИ

рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдирдХрд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред

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

function otherFunc()
function otherFunc(arg1: string)
function otherFunc(arg1: string, arg2: number)
function otherFunc(...args: any[]) {
  // Do stuff
}

рдпрд╣ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб 2.7 рдкрд░ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рдХреИрд╕реЗ рд╣реИ? рдлреИрд▓реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдЬреЗрдПрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдЬреНрдЮрд╛рдХрд╛рд░реА рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯреАрдПрд╕ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рдЦрд╛рддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@ jpike88 рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдЙрддреНрдкрд╛рджрдХ рд╣реИрдВред рдореБрджреНрджрд╛ рдЙрдирдХреЗ TODO рдореАрд▓ рдХреЗ рдкрддреНрдерд░ 2.7 рдпрд╛ 2.8 рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╣ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЬрд╛рд░реЛрдВ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред рдЕрдкрдиреЗ рд╡реЛрдЯ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ your рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рдж рдореБрдлреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдФрд░ рд╡реЗ рд╣рдореЗрдВ рдХреБрдЫ рднреА рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░рд╛ рд▓реЗрдирд╛ рд╣реИ, рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдХреА рддрд░рд╣ рдЖрдк ЁЯХ║

рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЯреЗрд╕реНрдЯрдХреЗрд╕ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯреАрдПрд╕ 2.7 рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди) рдпрд╣ рд╣реИ:

class NonEmptyArray<T> extends Array<T> {
        0: T;
}

function c(firstArg: string, ... plainValues: string[]): string;
function c(): undefined;
function c(...values: string[]): string | undefined {
        if (!values.length) {
                return undefined;
        }
        return "";
}


function d(): NonEmptyArray<string> {
        return [""];
}

function y(): string | undefined {
        return c(...d());
}

рдпрд╣ рдЙрддреНрддрдкрди рдХрд░рддрд╛ рд╣реИ

test.ts (20,9): рддреНрд░реБрдЯрд┐ TS2557: рдХрдо рд╕реЗ рдХрдо 0 рддрд░реНрдХ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд▓реЗрдХрд┐рди 0 рдпрд╛ рдЕрдзрд┐рдХ рдорд┐рд▓рд╛ рд╣реИред

рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдЖрдпрд╛:

const get = (id?: string = '1231254', bar?: Bar, baz?: Baz) => {...}
const foo: [undefined, Bar, Baz] = [undefined, bar, baz]

get(...foo) // [ts] Argument of type 'Bar | Baz' is not assignable to parameter  
of type 'string'.
Type 'Baz' is not assignable to type 'string'

рдмреЗрд╢рдХ, рдИрдПрд╕ 6 рдореЗрдВ рдореБрдЭреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдлреИрд▓рд╛рдиреЗ рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ undefined рдареАрдХ рд╕реЗ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЯреАрдПрд╕ рдиреЗ undefined рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрдм рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдлреИрд▓рд╛рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреА рд╕рд╣реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдмрд╣реБрдд рдорджрдж рдХрд░реЗрдЧреА:
рдореЗрд░реЗ рдкрд╛рд╕ NSwagStudio рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ - C # WebApi рдХреЗ рд▓рд┐рдП API рдЬрдирд░реЗрдЯрд░, рдЬрд┐рдирдХреЗ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (GET рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ)

рдЙрддреНрдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

export interface ITableApiClient {
    getTableInfo(objnam: string | null, objsch: string | null | undefined, dbnam: string | null, conid: number | undefined): Promise<FileResponse | null>;
    otherFunction(objnam: string | null, objsch: string | null | undefined, dbnam: string | null, conid: number | undefined): Promise<string | null>;
}

рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

   get tableIdentification() {
       return [this.name, this.schema, this.databaseName, this.serverConnectionId];
   }
...
   return apiClient.getTableInfo(...this.tableIdentification);

   // this doesn't help, still compile-time error
   // return apiClient.getTableInfo(...(this.tableIdentification as any));

рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ C # рдмреИрдХрдПрдВрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ)ред рдЕрдм рдореБрдЭреЗ рдкреНрд░реЙрдкрд░реНрдЯреА рдЯреЗрдмрд▓рдЖрдИрдбреЗрдВрдЯрд┐рдлрд┐рдХреЗрд╢рди рдПрди-рдЯрд╛рдЗрдо рдХреЗ рдмреЙрдбреА рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛

@smashdevcode рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди @ ts-

function foo(x: number, y: number, z: number) { }
var args = [0, 1, 2];
// @ts-ignore
foo(...args);

рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг: https://stackblitz.com/edit/typescript-ecymei?embed=1&file=exex.ts

@ darekf77 , рдпрд╛ рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ args рдЯрдкрд▓ рд╣реИ:

function foo(x: number, y: number, z: number) { }
const args: [number, number, number] = [0, 1, 2];
foo(...args);

TS-рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

@ darekf77 , рдпрд╛ рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ args рдЯрдкрд▓ рд╣реИ:

function foo(x: number, y: number, z: number) { }
const args: [number, number, number] = [0, 1, 2];
foo(...args);

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ jayphelps рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЧрд╛рдореА рд░рд┐рд▓реАрдЬ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ? рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ @ ts-ign рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

@TidyIQ рдЬреИрд╕рд╛ рдХрд┐ рдЯреБрдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рд╕рд░рдгреА рдирд┐рд╢реНрдЪрд┐рдд-рд▓рдВрдмрд╛рдИ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

(рдпрд╣ рдкреНрд░рд╢реНрди рд╕рдВрднрд╡рддрдГ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ (рдпрд╛ рд╕рдорд╛рди) рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)

@TidyIQ , рдпрджрд┐ рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдареАрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

function foo(x: number, y: number, z: number) { }
const args = arrayOfSomeLength;
foo(...args); // Error: The compiler do not know if there is 3 or 2 or 1 or 50 elements in the array. 

рддреЛ рдЕрдЧрд░ рд╕рд░рдгреА рдЧрддрд┐рд╢реАрд▓ рд▓рдВрдмрд╛рдИ рдХреА рд╣реИ, рддреЛ рддрд░реНрдХ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐:

function foo(...args: number[]) { }
const args = arrayOfSomeLength;
foo(...args);

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдореЗрд░реЗ рдХреБрдЫ args рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рд╣реИред

рд╢рд╛рдпрдж рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИред

interface IF_Object {
  [key: string]: object;
}
//  VALUE SHOULD BE REQUIRED BUT MADE OPTIONAL TO BYPASS TYPESCRIPT ERROR
interface IF_SetKV {
  (key: string, value?: any): Function;
}
//  VALUE SHOULD BE REQUIRED BUT MADE OPTIONAL TO BYPASS TYPESCRIPT ERROR
interface IF_CreateState {
  (key: string, value?: any, ...more: string[]): Function;
}

const setKV: IF_SetKV = (key, value) => (object: IF_Object = {}) => ({
  ...object,
  [key]: value
});

const createState: IF_CreateState = (key, value, ...more) => (
  object: IF_Object = {}
) =>
  more.length === 0
    ? setKV(key, value)(object)
    : setKV(key, createState(value, ...more)(object[key]))(object);

// TYPESCRIPT ERROR OCCURS HERE. CAN ONLY BE REMOVED WITH TS<strong i="7">@IGNORE</strong>
const newState = createState(...stateList, action.payload.value)(reduced);

@TidyIQ , рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ stateList рдЦрд╛рд▓реА рд╕рд░рдгреА рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ action.payload.value рдХреЛ key рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

const createState = (...args: string[]) => (object: IF_Object = {}) => {
  const [key, value, ...rest] = args;
  if (rest.length === 0) {
    setKV(key, value)(object)
  } else {
    setKV(key, createState(value, ...rest)(object[key]))(object);
  }
}

рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ ParameterType рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдлреИрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рддрд░реНрдХ рджреЗ рд░рд╣реЗ рд╣реИрдВред

const add = (a: number, b: number) => a + b

const values = {
  a: 1,
  b: 2,
}

type AddParams = Parameters<typeof add>

add(...(values) as AddParams)

@ mateja176 рдпрд╣ рднреА рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛред

add(...(values as [number,number]))

рдпрд╛

add(...(values as [any,any]))

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдордирдорд╛рдиреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

type NonEmptyArray<T extends any[]> = T extends (infer U)[]
  ? [U, ...U[]]
  : never

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

add(...values as NonEmptyArray<typeof values>)


рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг

NonEmptyArray рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪреНрдЫреЗрджрди рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

# # рднрд╛рдЧ | рд╡реНрдпрд╛рдЦреНрдпрд╛
- | - | -
(рез) | type NonEmptyArray | рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо
(реи) | <T | рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ T рд▓реЗрддрд╛ рд╣реИред
(рей) | extends any[]> | рдкреНрд░рдХрд╛рд░ рдЪреЗрдХрд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ T рдХреБрдЫ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
(рек) | T extends (infer U)[] ? | рд╣рдорд╛рд░рд╛ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ T рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рд╣реИред
рд╣рдордиреЗ (3) рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ T рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╣рдореЗрд╢рд╛ рдЧреБрдЬрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╢рд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ infer рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ T рд╕рд░рдгреА рд╕реЗ рдмрдирд╛ рд╣реИ рдФрд░ рд╣рдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ U ред
(рел) | [U, ...U[]] | рдЕрдм рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд╕рд░рдгреА рдЬрд╣рд╛рдВ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ U рдФрд░ рд╢реЗрд╖ (0 рдпрд╛ рдЕрдзрд┐рдХ) рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рднреА U ред
рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреА рд╡рдЬрд╣ рд╕реЗ рдЯрдкрд▓ рдЕрдВрдХрди, рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдЕрд╡рдЧрдд рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЖрдЗрдЯрдо рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рд╣реИред
(рем) | : never | рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ: рд╕рд╢рд░реНрдд рд╕рд┐рд░реНрдл U рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд▓ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо never рдЙрдкрдЬ рджреЗрдХрд░ "рдФрд░" рд╢рд╛рдЦрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рдЕрдЧрд░ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ ...

ts const values = [1,2,3] add(...values as NonEmptyArray<typeof values>)

... рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:

  • typeof values рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ values рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ: number[] ред
  • рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рд╣рдо number[] рдХреЛ T ред (2/3)
  • T рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ U рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ number ред (4)
  • рдЕрдм рдЬрдм рд╣рдо U number рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдо [number, ...number[]] рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред (5)

@tjoskar рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдмрджрд▓ рджреЗрдВ

function foo(x: number, y: number, z: number, f: number) { }
const args: [number, number, number] = [0, 1, 2];
foo(...args, 3);

( рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди )
рдФрд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ред

рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ foo(3, ...args); рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ - рддреЛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред

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

onSetValue={(...args: Parameters<typeof props.onSetValue>) => {
    setLanguage(null);
    props.onSetValue(...args); // Expected 2 arguments, but got 0 or more.
  }}

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ props.onSetValue рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдмрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА Expected 2 arguments, but got 0 or more. рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ ред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ

рдпрд╣рд╛рдБ @ Haaxor1689 рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд░реВрдк рд╣реИ рдЙрджрд╛рд╣рд░рдг:
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд▓рд┐рдВрдХ

рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдпрд╣ рдореЗрд░рд╛ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рд╣реИ

class Board {
  private events: Events

  public on(...args: Parameters<this['events']['on']>) {
    this.events.on.call(this.events, ...args)
  }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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