通用类型的打字稿长度

Kou*_*sha 5 javascript generics typescript

我有一个看起来像的功能

export function is<T extends any[]>(...klasses): Predictor<T> {
    return (...variables: T) => {
        return variables
            .every((variable, index) => variable instanceof klasses[index]);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,我要确保klasses与数组的长度相同T。如何与长度相同klasses的类型?any[]T

更新资料

根据评论,我已将其更新为

export function is<T extends Array<any>>(...klasses: any[] & {length: T['length']}): Predictor<T> {
    return (...variables: T) => {
        return variables
            .every((variable, index) => variable instanceof klasses[index]);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_* L. 1

您可以查询类数组的长度,然后限制变量长度相同:

export function is<TClasses extends any[]>(...klasses: TClasses) {
    return (...variables: any[] & { length: TClasses['length'] }) => {
        return variables
            .every((variable, index) => variable instanceof klasses[index]);
    }
}

is(Number, String)(1, 1); // ok
is(Number, String)(1); // error: Types of property 'length' are incompatible
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您将无法预先指定变量类型。如果您可以更改实现以允许自动推断类类型,您可以使用:

export function is<T extends any[]>() {
    return <TClasses extends any[]>(...klasses: TClasses) =>
        (...variables: T & { length: TClasses['length'] }) =>
            variables.every((variable, index) => variable instanceof klasses[index]);
}

is<string[]>()(Number, String)('1', '1'); // ok
is<string[]>()(Number, String)(1, 1); // error: not assignable to type 'string[]'
is()(Number, String)(1); // error: Types of property 'length' are incompatible
Run Code Online (Sandbox Code Playgroud)