typescript - 确保字符串文字联合属于对象的键
问题描述
export type A = "a" | "b" | "c";
const obj = { a: 4, b: 5, c: 6, d: 7 };
如何确保所有元素A
都是 object 的键obj
?
解决方案
根据您的需要,您可以自动构造您的类型:
作为一个类型的所有键
您可以使用keyof
将所有键作为一个联合。由于keyof
需要在类型上使用,因此keyof typeof obj
:
const obj = { a: 4, b: 5, c: 6, d: 7 };
export type A = keyof typeof obj; // "a" | "b" | "c" | "d"
删除一些键
然后,您可以Exclude
获取一些密钥并获得其余的:
const obj = { a: 4, b: 5, c: 6, d: 7 };
type AllKeys = keyof typeof obj;
export type A = Exclude<AllKeys, "d">; // "a" | "b" | "c"
该AllKeys
类型只是为了方便,您可以内联它并使用Exclude<keyof typeof obj, "d">
只允许某些键
这将与Exclude
- 而不是将键列入黑名单相反,您有一个白名单,并且仅使用交叉点选择其中存在的键:
const obj = { a: 4, b: 5, c: 6, d: 7 };
type AllKeys = keyof typeof obj;
type AllowedKeys = "a" | "b" | "c" | "y" | "z";
export type A = AllKeys & AllowedKeys; // "a" | "b" | "c"
AllKeys
同样,这两种类型AllowedKeys
是为了方便起见。你也可以拥有相同的keyof typeof obj & ("a" | "b" | "c" | "y" | "z");
推荐阅读
- r - 将 HH:MM:SS 列转换为 ZT 时间
- python - 尝试创建一个可以在数组中找到最接近数字的函数
- bash - 如果没有返回则执行操作
- java - 与 Kotlin 在 Fragment 中共享首选项
- typescript - 如何使用 Jest 执行不以 spec.ts 或 test.ts 结尾的测试文件
- excel - COUNTIF across multiple cells based on criteria from another cell?
- c# - 返回多个 Json 响应
- python - 如何将numpy列表数组转换为元组数组
- flutter - Flutter 和 redux 操作
- docker - 如何将摇杆/诗歌配置 ROOT=TRUE 添加到 docker-compose 文件?