рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ / рдХреЙрд▓ рдЯрд╛рд░рдЧреЗрдЯ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдорд┐рд╕рдореИрдЪ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓реЗрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛:
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.
рдФрд░ рдРрд╕рд╛ рд╣реА рддрдм рд╣реИ рдЬрдм 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
рдХрд┐рд╕реА рднреА рджреВрд╕рд░реЗ рджреЛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:
any
ред)рдЯреБрдкрд▓реНрд╕ рдХреЗ рд╕рд╛рде:
(number | string)[]
рди [number, number, string]
)ред рдЦрд┐рд▓реМрдирд╛ рдХреЛрдб рдореЗрдВ рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрдЪрдд рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИредрд╣рд╛рдп @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);
@ 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)
}
}
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@ jpike88 рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдЙрддреНрдкрд╛рджрдХ рд╣реИрдВред рдореБрджреНрджрд╛ рдЙрдирдХреЗ TODO рдореАрд▓ рдХреЗ рдкрддреНрдерд░ 2.7 рдпрд╛ 2.8 рдХреЗ рд▓рд┐рдП рд╣реИ рдпрд╣ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЬрд╛рд░реЛрдВ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рд╣реИрдВ рддреЛ рдЖрдк рд╕рдВрднрд╡рддрдГ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрди рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред рдЕрдкрдиреЗ рд╡реЛрдЯ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ your рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреЗ рдмрд╛рдж рдореБрдлреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдФрд░ рд╡реЗ рд╣рдореЗрдВ рдХреБрдЫ рднреА рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░рд╛ рд▓реЗрдирд╛ рд╣реИ, рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдХреА рддрд░рд╣ рдЖрдк ЁЯХ║