Typescript: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งค๊ฐœ ๋ณ€์ˆ˜ / ํ˜ธ์ถœ ๋Œ€์ƒ ์„œ๋ช… ๋ถˆ์ผ์น˜๋ฅผ ์ž˜๋ชป๋ณด๊ณ  ํ•จ

์— ๋งŒ๋“  2015๋…„ 08์›” 03์ผ  ยท  55์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งค๊ฐœ ๋ณ€์ˆ˜ / ํ˜ธ์ถœ ๋Œ€์ƒ ์„œ๋ช… ๋ถˆ์ผ์น˜๋ฅผ ์ž˜๋ชป๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ TypeScript Playground์— ๋ถ™์—ฌ ๋„ฃ๊ธฐ :

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.
Bug Fixed

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@ jpike88 ๋‚˜๋Š” ๋‹น์‹ ์ด ์ž˜ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ์ง„์ˆ ์ด ๋น„์ƒ์‚ฐ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋งˆ์ผ์Šคํ†ค 2.7 ๋˜๋Š” 2.8์— ๋Œ€ํ•œ TODO์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ช…๋ฐฑํ•œ ์ผ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ช…๋ฐฑํ•œ ์‚ฌํ•ญ์ด ์ˆ˜์ฒœ ๊ฐœ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์‹œ์— ๋ชจ๋‘ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌํ•ญ์„ ๊ณ„์† ๊ฐœ์„  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํˆฌํ‘œ๋ฅผํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒ๋‹จ์˜ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์— ๐Ÿ‘ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ ๊ทธ๋“ค์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋นš์ง„ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ทธ๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž
๋„ˆ ๊ฐ™์€ TS์˜ ๐Ÿ•บ

๋ชจ๋“  55 ๋Œ“๊ธ€

args ์ด any -type

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 , ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ํฌํ•จ ๋œ ๊ฒฝ์šฐ์—๋„ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : new Set (). add (1) .add ( '๋ฌธ์ž์—ด')). ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ‹ฐ์ผ“์ผ๊นŒ์š”?

Set ๋ฐ ์Šคํ”„๋ ˆ๋“œ ์ž‘์—…์˜ ์˜ˆ (Chrome 46์—์„œ ์ž‘๋™)

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

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

๋„ค, ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Typescript๋Š” ์ด๋ฏธ ๋‚˜๋จธ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์œ ํ˜•์œผ๋กœ ๋ฐฐ์—ด์„ ์ง€์›ํ•˜๋ฉฐ, ์ด๋Š” ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ ˆ๋“œ ์ธ์ˆ˜๊ฐ€ ์–ด๋””์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ํ•จ์ˆ˜ ๋‚˜ ๊ณ ์ • ๋œ ์ˆ˜์˜ ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ํ•จ์ˆ˜์— ๋™์ข… ๋ฐฐ์—ด / ์„ธํŠธ๋ฅผ ์ „๋‹ฌ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์ „ํ™” ํ•  ์ผ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์ €๋Š” ์˜ค๋Š˜ ์•„์นจ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ typescript [email protected] ๋ฐ http://www.typescriptlang.org/Playground ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

ํ•˜๋‚˜,
๋‚˜๋Š” ๋‹จ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ™•์‚ฐ ์—ฐ์‚ฐ์ž์ด์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๋ ค์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ
์ปดํŒŒ์ผ ํƒ€์ž„์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์„ ํƒ ์‚ฌํ•ญ ์ผ ํ•„์š”๊ฐ€์—†๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€
"spread-variable"์ด ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค (์˜ˆ : ๋ฒˆํ˜ธ[]

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

๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ ์ฝ”๋“œ๋Š” ํ˜„์žฌ ๋ฒ„์ „์˜ typescript์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์„ ๋•Œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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 ์˜ combineLatest ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์˜ˆ์ œ์—์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ projectFn ๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ this ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ˆ˜๋ฅผ ์ „ํŒŒํ•˜์‹ญ์‹œ์˜ค.

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

ํ˜„์žฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

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

FWIW, ๋˜ ๋‹ค๋ฅธ ์‹ค์ œ ์‚ฌ๋ก€๋Š” lodash์—์„œ ๋ณ‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ์‹ฌ์ธต ๋ณ‘ํ•ฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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);
}

then : _ [ts] ์ œ๊ณต๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋Œ€์ƒ์˜ ์„œ๋ช…๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ._

๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ๊ทธ๋Ÿฌํ•œ ์ผ์„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ :

์ œ๊ณต๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋Œ€์ƒ์˜ ์„œ๋ช…๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ’์— ์˜ฌ๋ฐ”๋ฅธ ๋‚ ์งœ ์ƒ์„ฑ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ @mhegazy ? ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

๊ฐ’์— ์˜ฌ๋ฐ”๋ฅธ ๋‚ ์งœ ์ƒ์„ฑ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ @mhegazy ? ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€๋ฅผ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๊นŒ?

๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด์ด ๋ฌธ์ œ๊ฐ€ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋“  ๋„์›€ / ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌผ์–ด๋ณผ ์˜๋ฌด๊ฐ€ ์žˆ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ์ง€๊ธˆ์ด๋ผ๋ฉด ์ •ํ™•ํžˆ ์™œ์ด ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ๋“  ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

.js ํŒŒ์ผ์˜ ์ด๋ฆ„์„ .ts ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์‹ค์ œ๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , "์œ ํšจํ•œ ๋ชจ๋“  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);
    }
}

typescript ๋†€์ดํ„ฐ ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@owlcode ์ด๊ฒƒ์€ TS 2.4์— ์žˆ์ง€๋งŒ 2.4 ๋ฆด๋ฆฌ์Šค ์ดํ›„๊นŒ์ง€ ํ”Œ๋ ˆ์ด ๊ทธ๋ผ์šด๋“œ๋Š” TS 2.3์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ TS 2.4์—์„œ ์ˆ˜์ • ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ TS 2.4์—๋Š” ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TS2461 : '๋ฐ˜๋ณต ๊ฐ€๋Šฅ'์€ ๋ฐฐ์—ด ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ( [...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 ์‹ค์ œ ๊ด€์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋‚˜๋จธ์ง€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋‹จ์ผ ์ธ์ˆ˜ ๋˜๋Š” ๋ฐฐ์—ด์„ ๋ฐ›์•„๋“ค์ด๋„๋ก API๋ฅผ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 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์—์„œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” JS์—์„œ ์ž‘์—…ํ•˜๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ TS๋Š”์ด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ jpike88 ๋‚˜๋Š” ๋‹น์‹ ์ด ์ž˜ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ์ง„์ˆ ์ด ๋น„์ƒ์‚ฐ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋งˆ์ผ์Šคํ†ค 2.7 ๋˜๋Š” 2.8์— ๋Œ€ํ•œ TODO์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ช…๋ฐฑํ•œ ์ผ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ช…๋ฐฑํ•œ ์‚ฌํ•ญ์ด ์ˆ˜์ฒœ ๊ฐœ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์‹œ์— ๋ชจ๋‘ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ์˜ˆ์ƒ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌํ•ญ์„ ๊ณ„์† ๊ฐœ์„  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํˆฌํ‘œ๋ฅผํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒ๋‹จ์˜ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์— ๐Ÿ‘ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ ๊ทธ๋“ค์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋นš์ง„ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ทธ๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž
๋„ˆ ๊ฐ™์€ TS์˜ ๐Ÿ•บ

๋˜ ๋‹ค๋ฅธ ์ข‹์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค (์‹ค์ œ๋กœ TS 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'

๋ฌผ๋ก  ES6์—์„œ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์„ ์ธ์ˆ˜๋กœ ํฌํ•จํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ undefined ์—†์ง€๋งŒ TS๊ฐ€ 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 # ๋ฐฑ์—”๋“œ์— ์ •์˜ ๋œ ๋™์ผํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ์ด์ œ ๊ฐ ์‚ฌ์šฉ์— n ๋ฒˆ ์†์„ฑ tableIdentification ๋ณธ๋ฌธ์„ ๋ณต์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@smashdevcode ๋‚˜๋ฅผ ์œ„ํ•ด ์†”๋ฃจ์…˜์€ @ ts-ignore๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

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=index.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);

์ด๊ฒƒ์€ ๋ช…๋ น ์ค„์—์„œ typescript๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ ์ž‘๋™ํ•˜์ง€๋งŒ ์ž…๋ ฅํ•˜๋Š” ๋™์•ˆ Visual Studio Code๊ฐ€ typescript์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌ ํ•  ๋•Œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒƒ์ด ๋ญ”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

jayphelps๊ฐ€ ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ ํ•œ ์ง€ 1 ๋…„์ด ๋„˜์—ˆ์ง€๋งŒ์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? @ ts-ignore๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ชจ๋“  typescript ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

tjoskar ๊ฐ€ ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ

๋ฐฐ์—ด์€ ๊ณ ์ • ๊ธธ์ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜•๋ณ€ํ™˜์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋น„์ •์ƒ์ ์ธ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

(์ด ์งˆ๋ฌธ์€ ์•„๋งˆ๋„ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ (๋˜๋Š” ์œ ์‚ฌ)๋กœ ์˜ฎ๊ฒจ ์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค)

@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);

์šด๋™์žฅ

๋ถˆํ–‰ํžˆ๋„ ๋‚ด ์ธ์ˆ˜ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ณ ์ • ๊ธธ์ด์ด๋ฏ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ฝ”๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์œ ํ˜•์— ๋Œ€ํ•œ ๋‹ค์Œ ๋ถ„์„์—์„œ๋Š” ์ž‘๋™ ๋ฐฉ์‹์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

# | ๋ถ€ํ’ˆ | ์„ค๋ช…
-|-|-
(1) | type NonEmptyArray | ๋„์šฐ๋ฏธ ์œ ํ˜•์˜ ์ด๋ฆ„
(2) | <T | ํ—ฌํผ ์œ ํ˜•์€ ์ผ๋ฐ˜ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜ T ํ•ฉ๋‹ˆ๋‹ค.
(3) | extends any[]> | ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์—์„œ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜ T ๊ฐ€ ์ผ๋ถ€ ๋ฐฐ์—ด ์œ ํ˜•์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
(4) | T extends (infer U)[] ? | ํ—ฌํผ ์œ ํ˜•์€ T ์‹ค์ œ๋กœ ๋ฐฐ์—ด ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด๋ถ€ ์œ ํ˜• ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์„ ์–ธ ํ•œ T ์ด ์กฐ๊ฑด์ด ํ•ญ์ƒ ํ†ต๊ณผํ•˜๋ฏ€๋กœ, (3)์˜ ๋ฐฐ์—ด ์œ ํ˜•์œผ๋กœ,ํ•˜์ง€๋งŒ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ํƒ€์ดํ”„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค infer ์œ ํ˜•์„ ๊ทธ T ๋ฐฐ์—ด ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ์ด ์œ ํ˜•์„ U ํ•ฉ๋‹ˆ๋‹ค.
(5) | [U, ...U[]] | ์ด์ œ ๊ฒฐ๊ณผ ์œ ํ˜•์„ ์–ด์…ˆ๋ธ” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด U ์œ ํ˜•์ด๊ณ  ๋‚˜๋จธ์ง€ (0 ๊ฐœ ์ด์ƒ) ํ•ญ๋ชฉ๋„ U ์œ ํ˜• ์ธ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
์ด ํŠน์ • ํŠœํ”Œ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ธํ•ด TypeScript๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์ด ์žˆ์Œ์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
(6) | : never | ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ ์ ์œผ๋กœ ์กฐ๊ฑด๋ถ€๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์–ตํ•˜์„ธ์š” : ์กฐ๊ฑด๋ถ€๋Š” U ์œ ํ˜•์„ ์ถ”์ถœํ•˜๋Š” ํŠธ๋ฆญ์ด๋ฉฐ ํ•ญ์ƒ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ never ๋ฅผ ์‚ฐ์ถœํ•˜์—ฌ "else"๋ถ„๊ธฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด์ œ ์ด๋ ‡๊ฒŒํ•˜๋ฉด ...

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

... ๋‹ค์Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • typeof values ๋Š” TypeScript๊ฐ€ 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 ๋“ฑ๊ธ‰