我可以将对象属性的名称用作对象中的字符串值吗? 我的意思是,我想实现这一点:

type MyObjectType = /* ... */

const myValidObject: MyObjectType = {
  a: 'a',
  b: 'b'
} // valid object of type MyObjectType

const myInvalidObject: MyObjectType = {
  a: 'a',
  b: 'c'
} // invalid object of type MyObjectType, property b should have value 'b'

我试过这样的方法,但不起作用:

type MyObjectType = {
  [K: string]: `${K}`
}

推荐答案

Typescript 中没有specificMyObjectType字可以满足你的需要.相反,您可以创建一个generic类型,其中类型参数K是对象中的union个关键点:

type MyObjectType<K extends PropertyKey> =
  { [P in K]: P }

但你可能不想自己写出MyObjectType<"a" | "b">份.这意味着您将需要一个泛型助手函数来为您的类型参数设置infer:

const myObjectType =
  <K extends PropertyKey>(o: MyObjectType<K>) => o;

现在,你写的是const o = myObjectType({⋯}),而不是const o: MyObjectType = {⋯}.这对你来说工作量是一样的,但它给了你想要的行为:

const myValidObject = myObjectType({
  a: 'a',
  b: 'b'
});
// const myValidObject: MyObjectType<"a" | "b">

const myInvalidObject = myObjectType({
  a: 'a',
  b: 'c' // error
  // Type '"c"' is not assignable to type '"b"'.
});
// const myInvalidObject: MyObjectType<"a" | "b">

Playground link to code

Typescript相关问答推荐

net::BER_RECTION_REUSED和Uncatch使用Axios和TanStack-Query useMutation时未捕获错误(DelivercMutation)

TS不推断类型在条件判断后具有属性'

将props传递给子组件并有条件地呈现它''

如何使用泛型类型访问对象

webpack错误:模块找不到.当使用我的其他库时,

如何使用泛型自动推断TS中的类型

使用动态主体初始化变量

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

如何将泛型对象作为返回类型添加到类型脚本中

如何在已知基类的任何子类上使用`extends`?

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

类型脚本可以推断哪个类型作为参数传递到联合类型中吗?

在Cypress中,是否可以在不标识错误的情况下对元素调用.Click()方法?

内联类型断言的工作原理类似于TypeScrip中的断言函数?

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'

React-Router V6 中的递归好友路由

是否可以使用元组中对象的键来映射类型

如何在没有空接口的情况下实现求和类型功能?

React router - 如何处理嵌套路由?

React 中如何比较两个对象数组并获取不同的值?