gpt4 book ai didi

javascript - 在 Typescript 中声明对象类型时,我可以用什么替换 'any'?

转载 作者:行者123 更新时间:2023-12-04 13:09:53 28 4
gpt4 key购买 nike

class ResistorColor 
{
private colors: string[]

public colorValues: any = {
grey: 8,
white: 9
}
}

'any' 意味着 Typescript 不应该关心它的类型。

我想用类型替换“任何”。我们如何在 Typescript 中为此类对象提供适当的类型?

最佳答案

您不想使用 any除非你绝对必须这样做。 any意味着类型实际上可以是任何类型,因此您不知道该类型是什么。 Typescript 无法检查变量是否被滥用,因为您已经说过“一切都会发生”。

有很多方法可以正确输入此内容,但这里有一个想法。您可以定义一个 type Color这是 string 的并集所有有效颜色的名称。你的private colors是这些的数组,所以它将是 Color[] .你的public colorValues是颜色到数字的映射,因此您可以使用内置实用程序类型 Record 将其描述为 Record<Color, number>这是一个键类型为 Color 的对象值类型为 number . (如果不是所有颜色都存在于对象中,那么您将使用 Partial<Record<Color, number>> 进行不完整的映射)。

type Color = 'grey' | 'white';

class ResistorColor
{
private colors: Color[] = []; // initial value avoids "not assigned in the constructor" error

public colorValues: Record<Color, number> = {
grey: 8,
white: 9
}
}

Typescript Playground Link

获取 type Colors 可能有意义从使用 typeof在一组颜色名称上,但我不知道在您的代码中的哪个位置会有这样一个包含所有颜色的数组或对象。这可能有意义,例如,如果您初始化了 colorValues具有一定的基础值(value)。

const colors = ['grey', 'white'] as const; // use as const to preserve string literals

type Color = (typeof colors)[number]; // indexed access by [number] to get the element type
// resolves to: type Color = "grey" | "white"

class ResistorColor {
public colorValues: Record<Color, number>;

constructor(baseVal: number = 0) {
this.colorValues = {} as Record<Color, number>; // need to make an `as` assertion when starting with an incomplete object
colors.forEach(
color => this.colorValues[color] = baseVal
);
}
}

Typescript Playground Link

关于javascript - 在 Typescript 中声明对象类型时,我可以用什么替换 'any'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66594670/

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