繁体   English   中英

如何区分TypeScript重载中的类型对象和数组?

[英]How to distinguish type object and array in TypeScript overload?

这是我的代码:

public foo<T>(src: object, type: Type<T>): T;
public foo<T>(src: any[], type: Type<T>[]): T[];
public foo<T>(src: object | any[], type: Type<T> | Type<T>[]): T | T[] {...}

我想做的是保证以下约束的重载:

  • 一个对象(不是数组),一个Type>一个对象
  • 数组,类型>数组的数组

问题在于类型对象也可以是数组,因此以下组合成为可能:

foo([...], MyType) > {}

有办法避免吗? 还是可以向我推荐重写过载的方法?

问题是数组是一个对象,因此如果采用数组参数的重载未能匹配,Typescript将继续进行到采用对象的下一个重载,并得出第一个参数与object兼容的结论。

如果第一个参数是对象重载上的数组,则可以使用条件类型在第二个参数中引入不兼容性。 同样,如果您需要推断一个数组的更多类型,则需要指定更多类型参数(每种类型最多指定一个合理数量的类型)

type Type<T> = new (...args:any[]) => T
type Type<T> = new (...args: any[]) => T
class C {
    public foo<T, P extends object>(src: P, type: P extends any[] ? never : Type<T>): T;
    public foo<T>(src: [any], type: [Type<T>]): [T];
    public foo<T, T1>(src: [any, any], type: [Type<T>, Type<T1>]): [T, T1];
    public foo<T, T1, T2>(src: [any, any, any], type: [Type<T>, Type<T1>, Type<T2>]): [T, T1, T2];
    public foo<T = any>(src: T[], type: Type<T>[]): T[]; // catch all oveload for arrays
    public foo(src: object | any[], type: Type<any> | Type<any>[]): any {

    }

}

class MyClass { private x!: string }
class MyClass2 { private x!: string }

let c = new C;
c.foo({}, MyClass) // ok, return My Class
c.foo({}, [MyClass]) // error
c.foo([], MyClass) // error
c.foo([{}], [MyClass]) // ok returns [MyClass]
c.foo([{}, {}], [MyClass, MyClass2]) // ok returns [MyClass, MyClass2]
c.foo([{}, {}, {}], [MyClass, MyClass2, MyClass]) // ok returns [MyClass, MyClass2, MyClass]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM