通用休息参数中的自约束元素

问题描述 投票:0回答:1

Typescript可以推断出受数组类型约束的通用rest参数的元组类型。但这在我的情况下不起作用。我正在尝试传递一系列对[function, argument],并希望对参数和函数类型是否匹配进行类型检查。有可能吗?

type User = {
    name: string
    age: number
}

function eatNumber(a: number) { }
function eatString(a: string) { }
function eatUser(a: User) { }

type FuncAndArg<F extends (arg: any) => void> = [F, Parameters<F>[0]]

function callMany<F extends (arg: any) => void, T extends FuncAndArg<F>[]>(...pairs: T) { }

const jack = {
    name: 'jack',
    age: 23
}

//argument type not checked
callMany([eatNumber, jack], [eatString, jack], [eatUser, jack])
typescript
1个回答
0
投票

我不认为您可以使用开放式...args来完成此操作,但是如果您为特定数量的参数重载,则可以执行此操作...您会看到类似rxjs(see the pipe typings )。

type TFunc<T> = [(arg: T)=>void, T];

function callMany<A>(p1: TFunc<A>);
function callMany<A, B>(p1: TFunc<A>, p2: TFunc<B>);
function callMany<A, B, C>(p1: TFunc<A>, p2: TFunc<B>, p3: TFunc<C>);
function callMany<A, B, C, D>(p1: TFunc<A>, p2: TFunc<B>, p3: TFunc<C>, p4: TFunc<D>);
function callMany<A, B, C, D, E>(p1: TFunc<A>, p2: TFunc<B>, p3: TFunc<C>, p4: TFunc<D>, p5: TFunc<E>);
function callMany(...args: any[]) { }

它会正确检查对:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.