【发布时间】:2021-03-25 19:55:31
【问题描述】:
我一直在玩Inferring types of deeply nested object in Typescript。
原始代码
const theme = {
button: { margin: { sm: "sm" } },
form: { padding: { sm: "sm1" } }
} as const;
type Theme = typeof theme;
const getStyle = <
K extends keyof Theme,
S extends keyof Theme[K],
M extends keyof Theme[K][S]
>(t: Theme, name: K, style: S, mod: M) => t[name][style][mod];
getStyle(theme, 'button', 'margin', 'sm');
我从原始示例中引入了一种变体 - 在我的代码中叶节点始终具有相同的结构 {sm: string}。
我正在努力修改getStyle,使客户端只能指定2级密钥,并受益于节点结构始终相同的事实;
const getStyleNew = <
K extends keyof Theme,
S extends keyof Theme[K]
>(t: Theme, name: K, style: S) => t[name][style].sm;
不幸的是,这失败了:
Property 'sm' does not exist on type '{ readonly button: { readonly margin: { readonly sm: "sm"; }; }; readonly form: { readonly padding: { readonly sm: "sm"; }; }; }[K][S]'.
有没有办法让编译器相信修改后的函数中t[name][style]上sm可用?
【问题讨论】:
标签: typescript