假设有一个像这样的对象:
const object = {
prop: "prop",
typedProp: "type-1",
};我希望typedProp属性只接受以下值:"type-1"、"type-2"、"type-3"。为此,我创建了一个自定义type,如下所示:
type CustomProp = "type-1" | "type-2" | "type-3";我知道我可以这样分配这个type:
const object: {
prop: string;
typedProp: CustomProp; // <-- Adding type here
} = {
prop: "prop",
typedProp: "type-1",
};我的问题是,有没有一种方法可以直接将这个type分配给typedProp (对象内),这样我就可以避免将type添加到整个对象中了吗?我试着用这种方式来实现它:
const object = {
prop: "prop",
typedProp: "type-1" as CustomProp,
};但是它并不像预期的那样工作,因为使用这种方法,我可以将任何string添加到typedProp中,这不是我想要实现的。如果有办法的话,你能告诉我吗?
发布于 2022-09-12 01:13:34
您正在寻找一个“安全上播”操作员,或“扩宽-唯一的类型断言”。TypeScript对这样的事情没有直接的支持。长期以来,人们一直在讨论所谓的satisfies操作符(可能很快就会实现),这个操作符是微软/打字稿#7481的主题,现在是微软/打字稿#47920的主题,有些人出于这样的原因想要它,尽管看起来“安全上播”部分将不被支持。因此,在可预见的将来,不会有语法为您做到这一点。
幸运的是,您可以通过一个助手函数来模拟这一点。
函数const customProp = (t: CustomProp) => t将只接受CustomProp输入,并以CustomProp类型返回其输入。不会对string进行任何扩展,也不会缩小到单个"type-1"字符串文字类型
const customProp: (t: CustomProp) => t;
const badObject = {
prop: "prop",
typedPop: customProp("oopsie-doodle") // error!
}
const object = {
prop: "prop",
typedProp: customProp("type-1"), // okay
};
object.typedProp = "type-2"; // okay如果您经常这样做,您可以编写此函数的通用版本,它接受手动指定的T类型的值,并使用非扩展的非狭窄类型T返回该值。
const safeUpcast = <T,>(t: T) => t;然后customProp函数只是safeUpcast 实例化的特例,T是CustomProp
const customProp = safeUpcast<CustomProp>;发布于 2022-09-12 01:30:16
也许你可以试着用TS“Enum”
定义您的自定义道具如下,
enum CustomProp {
type1 = "type-1",
type2 = "type-2",
type3 = "type-3"
}然后按如下方式使用,
const object = {
prop: "prop",
typedProp: CustomProp.type1,
};W3Schools指南:enums.php
https://stackoverflow.com/questions/73683553
复制相似问题