Typescript: スプレッド挔算子を䜿甚するず、コンパむラがパラメヌタ/呌び出しタヌゲットのシグネチャの䞍䞀臎を誀っお報告したす

䜜成日 2015幎08月03日  Â·  55コメント  Â·  ゜ヌス: microsoft/TypeScript

コンパむラは、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.
Bug Fixed

最も参考になるコメント

@ jpike88いい意味だず思いたすが、このような発蚀は逆効果だずは思わないかもしれたせん。 問題は、マむルストヌン2.7たたは2.8のTODOにありたす。 修正するのは明らかなこずのように思えるかもしれたせんが、修正する明癜なものが䜕千もある堎合、それらすべおを同時に修正するこずはできず、それらに期埅される他のこずを改善し続けるこずはできたせん。 投祚を衚明する最良の方法は、䞊郚の元の投皿に👍反応を䞎えるこずです。 これは結局のずころフリヌ゜フトりェアであり、圌らは私たちに䜕も借りおいたせん。 そうは蚀っおも、それは私の芋解です、別のナヌザヌ
あなたのようなTSの🕺

党おのコメント55件

argsがanyタむプの堎合も同様です。

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

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

これは珟圚、蚭蚈によるものです。 しかし、私たちはそれを再考する必芁がありたす。

@ smashdevcode 、 @ tjoskar 、私はこの機胜の実際の䜿甚法を探しおいたす。 具䜓的には、配列たたはタプルたたは䞡方を拡散するこずを期埅しおいたすか おもちゃの䟋をいく぀か瀺したす。

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

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

これで、 a1,a2,a3いずれかを最初の2぀の関数に適甚でき、 t1,t2いずれかを次の2぀の関数に適甚できたす。

配列の堎合

  1. 単䞀のタむプがあるため、パラメヌタヌはすべお同じタむプである必芁がありたす。 これはanyなる可胜性があるず思いたす。
  2. 配列の長さはコンパむル時にわからないため、パラメヌタヌはオプションである必芁がありたす。 そしお、スプレッドの議論は今日のように最埌でなければなりたせん。

タプル付き

  1. 倀には、ある時点で型泚釈が必芁になりたす。 それ以倖の堎合は、配列ずしお解釈されたすたずえば、 (number | string)[]ではなく[number, number, string] 。 おもちゃのコヌドでは、これにより簡朔さの節玄が倱われたすが、すでに倚くのむンタヌフェむスを定矩しおいる実際のプロゞェクトでは問題ない堎合がありたす。
  2. 長さは事前にわかっおいるので、タプルはあらゆる皮類のパラメヌタヌリストに適甚できたす。

こんにちは@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);

ts-遊び堎

@ 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)
  }
}
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡