ã³ã³ãã€ã©ã¯ãspreadæŒç®åã䜿çšãããšããã©ã¡ãŒã¿/åŒã³åºãã¿ãŒã²ããã®ã·ã°ããã£ã®äžäžèŽã誀ã£ãŠå ±åããŸãã ãã®ã³ãŒããTypeScriptãã¬ã€ã°ã©ãŠã³ãã«è²Œãä»ããïŒ
function foo(x: number, y: number, z: number) { }
var args = [0, 1, 2];
foo(...args);
ãã®ãšã©ãŒãçºçããŸãïŒ
Supplied parameters do not match any signature of call target.
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
ãããããæåã®2ã€ã®é¢æ°ã«é©çšã§ãã t1,t2
ããããã次ã®2ã€ã®é¢æ°ã«é©çšã§ããŸãã
é åã®å ŽåïŒ
any
ãªãå¯èœæ§ããããšæããŸããïŒã¿ãã«ä»ãïŒ
(number | string)[]
ã§ã¯ãªã[number, number, string]
ïŒã ããã¡ãã®ã³ãŒãã§ã¯ãããã«ããç°¡æœãã®ç¯çŽã倱ãããŸããããã§ã«å€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããŠããå®éã®ãããžã§ã¯ãã§ã¯åé¡ãªãå ŽåããããŸããããã«ã¡ã¯@sandersn ã
è¿ä¿¡ãé
ããªã£ãŠãã¿ãŸããã ç§ã¯ããªãã®è¿äºãå®å
šã«éããŸããã
ç§ã¯1ã€ã®ããŒã¿åã®é
åã®ã¿ã䜿çšããŠãããããã¿ãã«ããŒãžã§ã³ã¯ããŸãèå³ããããŸããã
ãã ããé¢æ°åŒã³åºãã®spreadæäœã¯ãå埩å¯èœãªãªããžã§ã¯ããåãå
¥ããå¿
èŠããããšæããŸãã ãããã£ãŠãããšãã°ã§åäœããã¯ãã§ãã map
ãšset
ããããã®å ŽåãããŒã¿ã«è€æ°ã®ããŒã¿åãå«ãŸããŠããå Žåã§ããspreadæŒç®åãšé£æºããã€ã³ã¿ãŒãã§ã€ã¹ãäœæããå¿
èŠããããŸãïŒäŸïŒnew SetïŒïŒãaddïŒ1ïŒ .addïŒ 'string'ïŒïŒã ããããããã¯å€åå¥ã®ãã±ããã§ããïŒ
Set
ãšã¹ãã¬ããæäœã®äŸïŒChrome 46ã§æ©èœïŒ
function foo(...args) {
console.log(...args);
}
var bar = new Set().add(1).add(2);
foo(...bar); // 1, 2
ãããããã¯å¥ã®åé¡ã§ãã Typescriptã¯ãæ®ãã®ãã©ã¡ãŒã¿ãŒã®åãšããŠé åããã§ã«ãµããŒãããŠããŸããããã¯ãæ±çšã«ããå¿ èŠããããã®ã§ãã ã¹ãã¬ããåŒæ°ã䜿çšã§ããå Žæã«ã€ããŠèª¬æããŠããã ãã§ãã
åçš®ã®é å/ã»ãããrest-parametersãæã€é¢æ°ã«æž¡ããŸããããããšãåºå®æ°ã®åŒæ°ãæã€é¢æ°ã«æž¡ããŸããïŒ ããªããåŒã¶ããšã«ã€ããŠãã£ãšè©³ããç¥ãããã®ã§ããã
ãŸããä»æãspreadæŒç®åãããã£ãŠã¿ãŸããããã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã¯ãææ°ããŒãžã§ã³ã®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));
ãã ããspreadæŒç®åã䜿çšãããšã眲åã®äžäžèŽãšã©ãŒãçºçããŸãã
ããäžã€ã®äŸ
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
ã«å€æŽãããšãã«ãå®éã«ãã®åé¡ãçºçããŸããã ãšã«ãããããã¹ãŠã®æå¹ãªJSãæå¹ãªTSã§ãããšã¯éããªãããšããäžäŸã
çŸåšãstyled-componentã®ã¡ãã£ã¢ãã³ãã¬ãŒãã®äŸãå®è£ ããéã«ãã®åé¡ãçºçããŠããŸãã
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[]
ã¿ã€ãã®åŒæ°ã§æ©èœããŸãã
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
ã®é·ããéçã«æ€èšŒã§ããªããããã³ã³ãã€ã©ãŒã¯args
ãå¿
èŠãªbaz
æºãããŠããããšãæ€èšŒããæ¹æ³ããããŸããã
ãã®é åã«æ®ãããŠããã®ã¯ãæ¢ç¥ã®ãµã€ãºã®ã¿ãã«ãåãé·ãã®å¿ é ã®åŒæ°ãæã€é¢æ°ãæºããããšãã§ããããã«ããããšã§ããããããããã¯æã£ãã»ã©åçŽã§ã¯ãããŸããã äŸãã°ïŒ
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ããã¯TS2.3ã«ãããŸãã
ããã¯TS2.4ã§ä¿®æ£ãããŠããããã§ãã
export function log(...args: any[]) {
console.log(...join(args.map(formatDevTools),' '));
}
ãã ãã TS2.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ãã®èšå®ã¯ãã¹ãŠã®é¢æ°ã·ã°ããã£ãç¡å¹ã«ãããããåŒæ°ã®éãäžèŽãããã«ïŒå°ãªããšãéçã§ã¯ãªãïŒspreadæŒç®åã䜿çšããŠåŒæ°ãæž¡ãããšãã§ããŸã
ããã¯--noStrictGenericChecks
è¡ãããšã§ã¯ãããŸããã https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#stricter-checking-for-generic-functionsãåç
§ããŠ
ç§ã¯ã¡ããã©ããã«åºããããŸããã
é£ããããšã¯ç解ã§ããŸãããå°ãªããšããéå°ãªãè°è«ã¯ç¹å®ã§ããã¯ãã§ãã
@sandersnã¯ãå®äžçã®èŠ³ç¹ãããreståŒæ°ã䜿çšãã代ããã«ãåäžã®åŒæ°ãŸãã¯é
åãåãå
¥ããããã«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ã§ãã
ãã®åé¡ã¯ããã®åé¡ã®éè€ãšèŠãªãããŸããã
ç§ã®å Žåã次ã®ããã«åæååã®1ã€ãšããŠ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ã®ðº
ãã1ã€ã®åªãããã¹ãã±ãŒã¹ïŒå®éã«ã¯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
å€ãæ¡æ£ãããšãã«ç¡èŠããŠããããã§ãã
é¢æ°åŒã³åºãã§spreadæŒç®åãæ£ããåŠçãããšã次ã®ãããªå®äŸããããŸãã
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ïŒããã¯ãšã³ãã§å®çŸ©ãããåããã©ã¡ãŒã¿ãŒã¯ã©ã¹ããçæãããããïŒã 次ã«ãããããã£tableIdentificationã®æ¬äœãå䜿çšæ³ã«nåã³ããŒããå¿ èŠããããŸã
@smashdevcodeç§ã«ãšã£ãŠã®è§£æ±ºçã¯ã@ ts-ignoreãè¿œå ããããšã§ãã
function foo(x: number, y: number, z: number) { }
var args = [0, 1, 2];
// @ts-ignore
foo(...args);
ããã§ã®äŸïŒ https ïŒ
@ 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);
ããã¯ãã³ãã³ãã©ã€ã³ã§ã¿ã€ãã¹ã¯ãªãããã³ã³ãã€ã«ãããšãã«æ©èœããŸãããå ¥åäžã«Visual StudioCodeãã¿ã€ãã¹ã¯ãªãããæ€èšŒãããšãã¯æ©èœããŸããã ããã§åæãäœã§ãããããããŸããã
jayphelpsãããã¯æ¬¡ã®ãªãªãŒã¹ã§ä¿®æ£ããããšè¿°ã¹ãŠãã1幎以äžãçµéããŠããããã§ããããã®åé¡ã¯åŒãç¶ãçºçããŸãã ããã«é¢ããæŽæ°ã¯ãããŸããïŒ @ ts-ignoreã䜿çšã§ããããšã¯ããã£ãŠããŸãããããã«ããé¢æ°ã®ãã¹ãŠã®typescriptã¡ãã»ãŒãžãåé€ããããããå®éã«ã¯é©åãªè§£æ±ºçã§ã¯ãããŸããã
tjoskarãè¿°ã¹ã@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);
æ®å¿µãªãããç§ã®åŒæ°ã®ããã€ãã¯åºå®é·ã§ããããããããæ©èœããŸããã
ãããããã³ãŒããæçš¿ããã ãã§åé¡ãçºçããå¯èœæ§ããããŸãã
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
å®éã«é
ååã§ãããã©ããããã§ãã¯ããæ¡ä»¶åã§ãã
ïŒ3ïŒã§T
ãé
ååãšããŠå®£èšããã®ã§ããã®æ¡ä»¶ã¯åžžã«ééããŸãããæ¡ä»¶ã䜿çšãããšãTypeScript infer
ã«T
é
åã®åãèš±å¯ã§ããŸããã§æ§æãããŠããããã®åãU
ãšåŒã³ãŸãã
ïŒ5ïŒ| [U, ...U[]]
| ããã§ãçµæã®åãã¢ã»ã³ãã«ã§ããŸããæåã®ãšã³ããªã®åãU
ã§ãæ®ãã®ïŒ0å以äžã®ïŒãšã³ããªãåU
é
åã§ãã
ãã®ç¹å®ã®ã¿ãã«è¡šèšã®ãããTypeScriptã¯å°ãªããšã1ã€ã®é
ç®ãããããšãèªèããŠããŸãã
ïŒ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ã®ðº