我正在尝试创建类型别名,在给定角度服务类的情况下,该别名是同一类的交集,并且同时使其所有函数属性的类型均为Unable to determine the serialization information for x => x.PetId.Value
也许很难遵循,所以这里有个例子。给定一个类<original function type> & jest.Mock
:
AuthenticationService
我想创建一个与export class AuthenticationService {
numberProp: number;
static staticFunc() {
return 'typeof AuthService';
}
login(username: string, password: string): Observable<boolean> {
return of(false);
}
getAuthSources(): string[] {
return [];
}
isSourceAuthorized(source: string) {
return true;
}
}
完全一样的类型,但是例如AuthenticationService
的类型为login
。
到目前为止,我所做的是:
((string, string) => Observable<boolean>) & jest.Mock
我的问题是试图使我的类型别名也包含type FunctionPropertyNames<T> = { [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never }[keyof T];
type MockService<aService> =
(aService & Record<FunctionPropertyNames<aService>, jest.Mock>) extends infer P ? P : never;
// the extends infer P part is to get a more explicit type rather than a type alias that hides the implementation
。我无法做类似staticFunc
的事情,因为Record<FunctionPropertyNames<typeof aService...
。我可以使用显式aService is being used as a value here
,但不能在类型参数typeof AuthenticationService
上使用。
当前解决方法
通过提供aService
作为类型参数,并在类型别名中使用typeof AuthenticationService
,我能够将静态方法添加到新类型:
InstanceType<>
是否可以编写这种方式,以便在键入这些交集类型以包括静态属性时使用interface Constructor<T = any> { new(...args: any[]): T; }
type MockService<aService extends Constructor> = ( // need to add original types of static functions
& InstanceType<aService>
& Record<FunctionPropertyNames<InstanceType<aService>>, jest.Mock>
& Record<FunctionPropertyNames<aService>, jest.Mock>
) extends infer P ? P : never;
而不是AuthenticationService
?