Typescript 用“own”覆盖固有类型;“更多”;正确类型脚本
我有一个函数,它返回一个承诺,该承诺将使用reflect进行解析 (承诺、解决和拒绝函数排队,然后执行) 该函数的输入是一个方法,它来自一个带有参数的对象,正如您在SingleTask类型中看到的那样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
因为我不返回承诺类型脚本中的任何内容,所以我假设您想要这种行为:
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>;