我想根据对象的值定义一个类型。
例如,
const foo = <const>{
'a': ['1', '2', '3', '4'],
'b': ['5', '6', '7', '8'],
'c': ['9', '10', '11', '12'],
};
type RandomType = typeof foo[Readonly<string>][number]; // '1' | '2' | '3' | ... | '12'
number
但是如果我用作索引类型,TypeScript 会报告以下错误
Type '{ readonly a: readonly ["1", "2", "3", "4"]; readonly b: readonly ["5", "6", "7", "8"]; readonly c: readonly ["9", "10", "11", "12"]; }' has no matching index signature for type 'string'.ts(2537)
一种解决方法是替换Readonly<string>
为keyof typeof foo
type RandomType = typeof foo[keyof typeof foo][number];
但它使语句更长更难阅读,特别是如果我使用的对象嵌套在另一个对象中,比如aaa.bbb.ccc.ddd.foo
.
为什么Readonly<string>
在上述情况下不起作用?
是keyof typeof foo
描述的最短形式'a' | 'b' | 'c'
吗?是否有任何类型可以替换它并使语句更易于阅读?