在TypeScrip中,您可以强制对象类型中的所有键以某个字符开头:

type A = {
    [key: `@${string}`]: number
}
// okay:
const a1: A = {
  '@aaa': 10
}
// error:
const a2: A = {
  'aaa': 10
}

我该如何反其道而行之?我不希望我的 keys 以@开头,就像这样:

type A = {
    [key: ????]: number
}
// error:
const a1: A = {
  '@aaa': 10
}
// okay:
const a2: A = {
  'aaa': 10
}

推荐答案

您可以创建启用此行为的联合类型.

第一种类型只是定义一个对象,其中键可以是任何字符串:

{ [k: string]: number }

对于第二种类型,我们可以排除以"@"开头的键,表示它们may存在,但使用"Never"类型使赋值变得不可能:

{ [K in `@${string}`]?: never }

结果类型定义将如下所示:

type A = { [k: string]: number } & { [K in `@${string}`]?: never }

// error:
const a1: A = {
   '@aaa': 10
}

// okay:
const a2: A = {
   'aaa': 10
}

Typescript相关问答推荐

Angular 17 -如何在for循环内创建一些加载?

数组文字中对象的从键开始枚举

带switch 的函数的返回类型的类型缩小

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

使用2个泛型类型参数透明地处理函数中的联合类型

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

使用KeyOf和Never的循环引用

如何在方法中正确地传递来自TypeScrip对象的字段子集?

如何通过TypeScrip中的函数防止映射类型中未能通过复杂推理的any值

如何在React组件中指定forwardRef是可选的?

如何按属性或数字数组汇总对象数组

Typescript -返回接口中函数的类型

类型与泛型抽象类中的类型不可比较

在抽象类属性定义中扩展泛型类型

为什么我的函数arg得到类型为Never?

如何在Reaction 18、Reaction-Rout6中的导航栏中获取路由参数

更漂亮的格式数组<;T>;到T[]

如何知道使用TypeScript时是否在临时工作流内运行

可以';t使用t正确地索引对象;联合;索引类型

基于可选参数的动态类型泛型类型