首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript:向对象中的单个属性添加自定义类型

TypeScript:向对象中的单个属性添加自定义类型
EN

Stack Overflow用户
提问于 2022-09-12 00:50:25
回答 2查看 34关注 0票数 1

假设有一个像这样的对象:

代码语言:javascript
复制
const object = {
  prop: "prop",
  typedProp: "type-1",
};

我希望typedProp属性只接受以下值:"type-1""type-2""type-3"。为此,我创建了一个自定义type,如下所示:

代码语言:javascript
复制
type CustomProp = "type-1" | "type-2" | "type-3";

我知道我可以这样分配这个type

代码语言:javascript
复制
const object: {
  prop: string;
  typedProp: CustomProp; // <-- Adding type here
} = {
  prop: "prop",
  typedProp: "type-1",
};

我的问题是,有没有一种方法可以直接将这个type分配给typedProp (对象内),这样我就可以避免将type添加到整个对象中了吗?我试着用这种方式来实现它:

代码语言:javascript
复制
const object = {
  prop: "prop",
  typedProp: "type-1" as CustomProp,
};

但是它并不像预期的那样工作,因为使用这种方法,我可以将任何string添加到typedProp中,这不是我想要实现的。如果有办法的话,你能告诉我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-12 01:13:34

您正在寻找一个“安全上播”操作员,或“扩宽-唯一的类型断言”。TypeScript对这样的事情没有直接的支持。长期以来,人们一直在讨论所谓的satisfies操作符(可能很快就会实现),这个操作符是微软/打字稿#7481的主题,现在是微软/打字稿#47920的主题,有些人出于这样的原因想要它,尽管看起来“安全上播”部分将不被支持。因此,在可预见的将来,不会有语法为您做到这一点。

幸运的是,您可以通过一个助手函数来模拟这一点。

函数const customProp = (t: CustomProp) => t将只接受CustomProp输入,并以CustomProp类型返回其输入。不会对string进行任何扩展,也不会缩小到单个"type-1"字符串文字类型

代码语言:javascript
复制
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返回该值。

代码语言:javascript
复制
const safeUpcast = <T,>(t: T) => t;

然后customProp函数只是safeUpcast 实例化的特例,TCustomProp

代码语言:javascript
复制
const customProp = safeUpcast<CustomProp>;

操场链接到代码

票数 0
EN

Stack Overflow用户

发布于 2022-09-12 01:30:16

也许你可以试着用TS“Enum”

定义您的自定义道具如下,

代码语言:javascript
复制
enum CustomProp {
  type1 = "type-1",
  type2 = "type-2",
  type3 = "type-3"
}

然后按如下方式使用,

代码语言:javascript
复制
const object = {
  prop: "prop",
  typedProp: CustomProp.type1,
};

W3Schools指南:enums.php

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73683553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档