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)
您可以查询类数组的长度,然后限制变量长度相同:
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)