gpt4 book ai didi

typescript - 如何: Typescript nested typing A>

转载 作者:行者123 更新时间:2023-12-02 01:34:59 24 4
gpt4 key购买 nike

是否可以在 typescript 中进行这种输入?

interface Worker<T> {
renderChunk: (projectUrl: string, from: number, to: number) => Promise<T>;
}

interface WorkerPool<W<U>> {
addWorker(worker: W, address: number): void;

getIdleWorker(): W | null;
}

但我还想要某种类型的限制来检查 W 应该是 Worker 的实现,假设您有一个 Worker 的实现,如下所示:

class RenderWorker implements Worker<string[]> {
renderChunk: (projectUrl: string, from: number, to: number) => Promise<string[]> {
return Promise.resolve(['Foo'])
}
}

以下实现应该可以被 typescript 接受:

class RenderWorkerPool implements WorkerPool<RenderWorker> {} 

但是这个应该 Not Acceptable ,因为 string 不是 Worker 的实现

class RenderWorkerPool implements WorkerPool<string> {} 

最佳答案

是的,使用 constrained generic types ,您可以确保 W 扩展 Worker

interface WorkerPool<W extends AaWorker<any>> {
addWorker(worker: W, address: number): void;

getIdleWorker(): W | null;
}

Playground Link

由于嵌套泛型,如果您想推断工作线程的类型,您还需要指定它:

interface WorkerPool<U, W extends AaWorker<U>> {
addWorker(worker: W, address: number): void;

getIdleWorker(): W | null;
}

Playground Link

但是,如 Bernardo Duarte在评论中指出,您可能根本不需要 Worker 的泛型。相反,只需采用具有正确泛型类型的任何符合标准的 Worker 实现即可:

interface WorkerPool<U> {
addWorker(worker: AaWorker<U>, address: number): void;

getIdleWorker(): AaWorker<U> | null;
}

Playground Link

(我已将上面的 Worker 更改为 AaWorker,这样您的 Worker 和 Web Worker 内置对象之间就不会出现命名冲突。)

关于typescript - 如何: Typescript nested typing A<B<GENERIC>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72577385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com