gpt4 book ai didi

typescript - 如何在 TypeScript 中严格定义对象值的子类类型

转载 作者:行者123 更新时间:2023-12-05 04:39:50 25 4
gpt4 key购买 nike

我想定义对象值的子类类型如下SHAPE_PARAMS .
我可以将带有类型断言的类型设置为 <CircleParameter> ,但无法检查缺少的属性。

如何严格定义子类类型?

const Shapes = {
CIRCLE_A: "CIRCLE_A",
CIRCLE_B: "CIRCLE_B",
RECTANGLE_A: "RECTANGLE_A",
} as const;
type Shapes = typeof Shapes[keyof typeof Shapes];

interface ShapeParameter {
color: string;
}

interface CircleParameter extends ShapeParameter {
radius: number;
}

interface RectangleParameter extends ShapeParameter {
width: number;
height: number;
}

const SHAPE_PARAMS: { [key in Shapes]: ShapeParameter } = {
[Shapes.CIRCLE_A]: <CircleParameter>{
color: "red",
radius: 1,
},
[Shapes.CIRCLE_B]: <CircleParameter>{
// color: "blue", <- Missed property cannot be linted.
radius: 2,
},
[Shapes.RECTANGLE_A]: <RectangleParameter>{
color: "green",
width: 3,
// height: 3, <- Missed property cannot be linted.
},
};

最佳答案

这里的问题是 <TypeName>语法断言对象具有该类型,而您希望编译器检查该对象具有该类型。

最好的解决方案可能是更改类型 { [key in Shapes]: ShapeParameter }以便更具体:

type ShapeParameterMap = {
[Shapes.CIRCLE_A]: CircleParameter,
[Shapes.CIRCLE_B]: CircleParameter,
[Shapes.RECTANGLE_A]: RectangleParameter,
}

const SHAPE_PARAMS: ShapeParameterMap = {
// ...
};

Playground Link

这样做的好处是您可以为 SHAPE_PARAMS[k] 获得更具体的类型当您使用一些 k 访问它时更具体的类型。

另一方面,也许这看起来代码重复太多;在这种情况下,您可以通过编写一个什么都不做但检查其参数类型的简单实用函数来实现您想要的:

function check<T>(arg: T): T {
return arg;
}

const SHAPE_PARAMS: Record<Shapes, ShapeParameter> = {
[Shapes.CIRCLE_A]: check<CircleParameter>({
color: "red",
radius: 1,
}),
[Shapes.CIRCLE_B]: check<CircleParameter>({
radius: 2,
// missing property 'color'
}),
[Shapes.RECTANGLE_A]: check<RectangleParameter>({
color: "green",
width: 3,
// missing property 'height'
}),
};

Playground Link

关于typescript - 如何在 TypeScript 中严格定义对象值的子类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70389901/

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