Typescript 用“own”覆盖固有类型;“更多”;正确类型脚本

Typescript 用“own”覆盖固有类型;“更多”;正确类型脚本,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我有一个函数,它返回一个承诺,该承诺将使用reflect进行解析 (承诺、解决和拒绝函数排队,然后执行) 该函数的输入是一个方法,它来自一个带有参数的对象,正如您在SingleTask类型中看到的那样 因为我不返回承诺类型脚本中的任何内容,所以我假设您想要这种行为: type SomeCtor = new () => { a(x: string, y: number): boolean, b(z: number): string } declare const q: Queue<So

我有一个函数,它返回一个承诺,该承诺将使用reflect进行解析

(承诺、解决和拒绝函数排队,然后执行)

该函数的输入是一个方法,它来自一个带有参数的对象,正如您在SingleTask类型中看到的那样


因为我不返回承诺类型脚本中的任何内容,所以我假设您想要这种行为:

type SomeCtor = new () => { a(x: string, y: number): boolean, b(z: number): string }
declare const q: Queue<SomeCtor>;
const a = q.addTaskToQueue(["a", ["", 1]]); // Promise<boolean>;
const b = q.addTaskToQueue(["b", [1]]); // Promise<string>;
addTaskToQueue()
方法必须是泛型的,否则最好得到另一个union作为返回类型,对应于整个
SingleTask
union。您希望返回类型取决于传入了
SingleTask
联合的哪个成员。一旦我们有了一个类型参数
S
对应于
SingleTask
的某个成员,我们就可以将返回类型表示为

Promise<ReturnType<InstanceType<T>[S[0]]>>
这要简单得多


好吧,希望这会有帮助;祝你好运


问题“我如何帮助typescript理解我将使用返回类型返回承诺,返回类型为函数的返回类型,该函数位于数组的第一个元素中,并在输入中给出?”非常令人困惑。你能把这句话改清楚一点吗?也许是多个短句而不是一个长句?而且,您的示例代码似乎不是一个;您是否可以编辑代码,以便任何人都可以将其放入像这样的独立IDE中,并亲自查看问题?祝你好运我重新措辞,我认为现在更容易理解。很抱歉,英语不是我的第一语言。我遇到一个错误-“函数实现丢失或声明后没有立即执行”。如何确保typescript返回我声明要返回的内容?因为事实上,我并不是在解决它内部的承诺,我需要一个解决方案,否则我将无法看到它。很可能您无法轻松地让编译器验证您的实现是否与签名匹配。如果您确信它确实存在,那么您可以使用来告诉编译器不要担心它。我考虑的这些细节超出了问题的范围,因为您的问题是“我如何才能声明正确的返回类型”,这大概是关于类型签名而不是实现的问题。
declare class Queue<T extends AnyClass> {
  addTaskToQueue<S extends SingleTask<T>>(task: S): Promise<ReturnType<InstanceType<T>[S[0]]>>;
}
Promise<ReturnType<InstanceType<T>[S[0]]>>
type SingleTask<T> = {
  [P in keyof T]-?: T[P] extends (...a: any) => any
  ? [P, Parameters<T[P]>]
  : never
}[keyof T]

type Task<T> = {
  task: SingleTask<T>
  resolve: (value?: unknown) => void
  reject: (reason: any) => void
}

declare class Queue<T> {
  instances: T[];
  queue: Task<T>[];
  object: new () => T;
  addTaskToQueue<S extends SingleTask<T>>(task: S): Promise<ReturnType<T[S[0]]>>;
}

type SomeType = { a(x: string, y: number): boolean, b(z: number): string }
declare const q: Queue<SomeType>;
const a = q.addTaskToQueue(["a", ["", 1]]); // Promise<boolean>;
const b = q.addTaskToQueue(["b", [1]]); // Promise<string>;