有没有办法在TypeScrip中强制使用动态键?

我正在try 实现一种类型,该类型强制对象具有创建键和更新键,但这些键应该以域文本为前缀:

const productRepoA: Repo = { } // Should fail because create and update keys are missing
const productRepoB: Repo = { productCreate: () => null } // Should fail because update key is missing
const productRepoC: Repo = { productUpdate: () => null } // Should fail because update key is missing
const productRepoD: Repo = { productCreate: () => null, productUpdate: () => null } // Should work because both keys are provided

const orderRepoA: Repo = { } // Should fail because create and update keys are missing
const orderRepoB: Repo = { orderCreate: () => null } // Should fail because update key is missing
const orderRepoC: Repo = { orderUpdate: () => null } // Should fail because update key is missing
const orderRepoD: Repo = { orderCreate: () => null, orderUpdate: () => null } // Should work because both methods are provided

我想像这样的事情应该行得通:

type Repo = {
  [key: `${string}Create`]: () => null
} & {
  [key: `${string}Update`]: () => null
}

但遗憾的是,这允许像我的示例中的选项A、B和C那样缺少键

推荐答案

这将解决问题,但您必须显式指定密钥:

type Repo<T extends string> = {
  [a in `${T}Update` | `${T}Create`]: () => null
//   [b : `${T}Update`]: () => null
}


const productRepoA: Repo<"product"> = { } // Should fail because create and update keys are missing
const productRepoB: Repo<"product"> = { productCreate: () => null } // Should fail because update key is missing
const productRepoC: Repo<"product"> = { productUpdate: () => null } // Should fail because update key is missing
const productRepoD: Repo<"product"> = { productCreate: () => null, productUpdate: () => null } // Should work because both keys are provided

const orderRepoA: Repo<"order"> = { } // Should fail because create and update keys are missing
const orderRepoB: Repo<"order"> = { orderCreate: () => null } // Should fail because update key is missing
const orderRepoC: Repo<"order"> = { orderUpdate: () => null } // Should fail because update key is missing
const orderRepoD: Repo<"order"> = { orderCreate: () => null, orderUpdate: () => null } // Should work because both methods are provided

演示:https://www.typescriptlang.org/play?#code/C4TwDgpgBAShYHsA8AVKEAewIDsAmAzlAcAE4CWOA5gHxQC8UA3gLABQUUA2gIZSVQABgBImKAL4BVMHh7ZBUAD5DREgMKkIciIIC6ALigAKAJQM6OAK4Aba+wD09ztwBGUQyLFSZ2vYdPmUFa27OLs4WwAxgg4JFBgpAh4lpHAcIgAgobpyABECUkpwLl0jExQ4lCOUADKABYINnhQAGY85NZQLhCRPJYE0JGa2lA8+FCWPthQANYQIEQ8mlAAtuQEBJRU7NGxwPGJyak5AELZ8HkFR8WlzAeFqRpa2P5m9BY2nZXV9Y3WzW0Ol0en0BhMptA5iB+EQ1hstjsYnErkUcmpzogkPlDkUSgw7ijUtJZC9jG8PrYKlUnL8mq12p1ur1+tBJiTIfMYat1ptqIi9vdrjkACIYy441J4sqCopPbSvQLBawAGhlRIhCveQU+VJ+DTpAHcEKQZsDmWCXAhgHVZvNFssCgA3ch4CB4CK7OLG12kHJZWAXLHeiCkKV3b40-X-elApmgwbDaZjZpskZQ+3QOG87ZRJH7YO+i5nAOY3IFsPlAty0kBLVK3WRv4Ahlm+Pg9m26Hrbnwvm5gUFtFioOkH0VqAF4nysmKnUR2pR5uxkEs9tpzndrMI-te0chkXDst70O3SvH6sQTUUlUT49Tmvk7WU+e06NGk2t1eW62rCDWpIZvczquu6bBAA

Typescript相关问答推荐

类型脚本:类型是通用的,只能索引以供阅读.(2862)"

React Hook中基于动态收件箱定义和断言回报类型

您可以创建一个类型来表示打字员吗

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

对扩展某种类型的属性子集进行操作的函数

如何在TypeScrip中从字符串联合类型中省略%1值

TypeScrip 5.3和5.4-对`Readonly<;[...number[],字符串]>;`的测试版处理:有什么变化?

打字类型保护递归判断

ANGLE独立组件布线错误:没有ActivatedRouting提供程序

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

使用TypeScrip的类型继承

如何将对象数组中的键映射到另一种对象类型的键?

如何将类似数组的对象(字符串::匹配结果)转换为类型脚本中的数组?

在正常函数内部调用异步函数

是否将Angular *ngFor和*ngIf迁移到新的v17语法?

KeyOf关键字在特定示例中是如何工作的

Typescript .根据枚举输入参数返回不同的对象类型

如何在TypeScript中描述和实现包含特定属性的函数?

传入类型参数<;T>;变容函数

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?