์ปดํ์ผ๋ฌ๋ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ๋งค๊ฐ ๋ณ์ / ํธ์ถ ๋์ ์๋ช ๋ถ์ผ์น๋ฅผ ์๋ชป๋ณด๊ณ ํฉ๋๋ค. ์ด ์ฝ๋๋ฅผ 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.
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
์ค ํ๋๋ฅผ ๋ ๋ฒ์งธ ๋ ํจ์์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
๋ฐฐ์ด์ ์ ์ํ์ญ์์ค.
any
์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.)ํํ ์ฌ์ฉ :
(number | string)[]
์๋ [number, number, string]
). ์ฅ๋๊ฐ ์ฝ๋์์๋ ๊ฐ๊ฒฐํ๊ฒ ์ ์ฝ ํ ์ ์์ง๋ง ์ด๋ฏธ ๋ง์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ์ค์ ํ๋ก์ ํธ์์๋ ๊ด์ฐฎ์ ์ ์์ต๋๋ค.์๋ ํ์ธ์ @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);
@ 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)
}
}
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@ jpike88 ๋๋ ๋น์ ์ด ์ ์๋ฏธํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด์ ๊ฐ์ ์ง์ ์ด ๋น์์ฐ์ ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ ์๋ ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ง์ผ์คํค 2.7 ๋๋ 2.8์ ๋ํ TODO์ ์์ต๋๋ค. ์์ ํด์ผ ํ ๋ช ๋ฐฑํ ์ผ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์์ ํด์ผ ํ ๋ช ๋ฐฑํ ์ฌํญ์ด ์์ฒ ๊ฐ์๋ ๊ฒฝ์ฐ ๋์์ ๋ชจ๋ ์์ ํ ์๋ ์์ผ๋ฉฐ ์์๋๋ ๋ค๋ฅธ ์ฌํญ์ ๊ณ์ ๊ฐ์ ํ ์๋ ์์ต๋๋ค. ํฌํ๋ฅผํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋จ์ ์๋ณธ ๊ฒ์๋ฌผ์ ๐ ๋ฐ์์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ฒฐ๊ตญ ๋ฌด๋ฃ ์ํํธ์จ์ด์ด๋ฉฐ ๊ทธ๋ค์ ์ฐ๋ฆฌ์๊ฒ ๋น์ง ๊ฒ์ด ์์ต๋๋ค. ์ฆ, ๊ทธ๊ฒ์ ๋ด ์๊ฐ์ ๋๋ค. ๋ค๋ฅธ ์ฌ์ฉ์
๋ ๊ฐ์ TS์ ๐บ