// These are utility types used throughout the Ember type definitions. They // should *never* be used in end user code. /** A safe-ish type representing any function. */ export type AnyFn = (...args: any[]) => unknown; export type AnyMethod = (this: Target, ...args: any[]) => unknown; export type MethodsOf = { [K in keyof O]: O[K] extends AnyFn ? O[K] : never; }; // Not just `keyof MethodsOf` because that doesn't correctly exclude all the // `never` fields. export type MethodNamesOf = { [K in keyof O]: O[K] extends AnyFn ? K : never; }[keyof O]; export type MethodParams> = Parameters[M]>; export type MethodReturns> = ReturnType[M]>; /** Get the return value of a method string name or a function. */ export type EmberMethodParams> = M extends AnyMethod ? Parameters : M extends keyof T ? T[M] extends AnyMethod ? Parameters[M]> : never : never; /** Get the return value of a method string name or a function. */ export type EmberMethodReturn> = M extends AnyMethod ? ReturnType : M extends keyof T ? T[M] extends AnyMethod ? ReturnType[M]> : never : never; /** * A type utility for Ember's common name-of-object-on-target-or-function * pattern for e.g. event handlers. */ export type EmberMethod = AnyMethod | keyof Target; // A way of representing non-user-constructible types. You can conveniently use // this by doing `interface Type extends Data<'some-type-name'> { ... }` for // simple types, and/or you can type-parameterize it as makes sense for your use // case (see e.g. `@ember/component/helper`'s use with functional helpers). declare const Data: unique symbol; export class Opaque { declare private [Data]: Data; } // export type { Opaque }; export {};