gpt4 book ai didi

typescript - 嵌套的 Typescript 泛型

转载 作者:行者123 更新时间:2023-12-05 02:15:29 24 4
gpt4 key购买 nike

我有以下类(class):

class Walls { }
class Furniture { }
class Layout<T extends Walls | Furniture> { }
class Space extends Layout<Walls> { }
class Room extends Layout<Furniture> { }

我需要创建这两个类:

class SpaceController extends LayoutController<Space> { }
class RoomController extends LayoutController<Room> {}

为此,我不能像这样创建 LayoutController 类:

class LayoutController<T extends Layout>{ }

因为 Layout 需要一个 Type 参数。

我可以创建这个:

class LayoutController<U, T extends Layout<U extends Walls | Furniture>>{ }

但这意味着我将不得不这样做:

class SpaceController extends LayoutController<Walls, Space> { }
class RoomController extends LayoutController<Furniture, Room> {}

我觉得这是多余的。此外,它为错误打开了空间。没有什么能阻止我写作:

class RoomController extends LayoutController<Walls, Room> {}

我该如何解决?

关于 LayoutController 的更多细节:

class LayoutController<T> extends React.Component<{}, LayoutControllerState<T>>() { }
interface LayoutControllerState<T> {
selectedLayout: T;
}

最佳答案

虽然输入更多的两种类型的参数解决方案还不错,如果 U 与布局期望的 T 不兼容,则会给您适当的错误,如果类型正确指定约束:

class Walls { height!: number; }
class Furniture { price!: number; }
class Layout<T extends Walls | Furniture> { children: T[] = []; }
class Space extends Layout<Walls> { private x: undefined; }
class Room extends Layout<Furniture> { private x: undefined; }

class LayoutController<U extends Walls | Furniture, T extends Layout<U>>{
getValue(u: U) : void{}
}

class SpaceController extends LayoutController<Walls, Space> { }
class RoomController extends LayoutController<Furniture, Room> {}
class ErrController extends LayoutController<Walls, Room> {} //Type 'Room' does not satisfy the constraint 'Layout<Walls>

我们可以使用条件类型从 Layout 类型中提取通用参数,并将其作为 U 的默认值。因此我们不必指定冗余参数:

type ExtractLayoutParameter<T extends Layout<any>> = T extends Layout<infer U> ? U: never;
class LayoutController<T extends Layout<any>, U extends Walls | Furniture= ExtractLayoutParameter<T>>{
getValue(u: U) : void{}
}

class SpaceController extends LayoutController<Space> { }
class RoomController extends LayoutController<Room> {}
new SpaceController().getValue(new Walls())
new SpaceController().getValue(new Furniture()) // error

我们也可以使用条件类型而不是 U 因此不允许用户将 U 更改为布局所接受的派生类型(取决于您的使用案例您决定的功能或设计限制):

type ExtractLayoutParameter<T extends Layout<any>> = T extends Layout<infer U> ? U: never;
class LayoutController<T extends Layout<any>>{
getValue(u: ExtractLayoutParameter<T>) : void{}
}

class SpaceController extends LayoutController<Space> { }
class RoomController extends LayoutController<Room> {}
new SpaceController().getValue(new Walls())
new SpaceController().getValue(new Furniture()) // error

关于typescript - 嵌套的 Typescript 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796871/

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