如何为嵌套对象访问键正确定义VersionKey类型?
如何为嵌套对象的层级键定义正确的TypeScript类型?
你需要通过两个键的组合从嵌套对象中获取特定层级的数据,但在定义访问嵌套对象的键的类型时遇到问题。给定如下对象结构:
const movies = { "Shawshank Redemption": { rating: 9, versions: { "Directors Cut": { length: 111, }, Cinema: { length: 113, }, }, }, "The Dark Knight": { release: 2008, versions: { Standard: { rating: 9, length: 113, }, }, }, }; type MovieKey = keyof typeof movies;
已定义MovieKey类型,需要为getMovieVersion方法中的VersionKey定义正确类型,同时保证类型合法性,具体实现如下:
解决方案:使用泛型关联参数类型
单独定义固定的VersionKey类型不可行,因为不同电影对应的版本键存在差异,必须让version参数的类型和传入的movie参数动态绑定。可以通过泛型实现这一约束:
// 提取整个movies对象的类型 type Movies = typeof movies; // 用泛型K约束movie参数,让version参数的类型依赖于当前选中的电影 function getMovieVersion<K extends keyof Movies>( movie: K, version: keyof Movies[K]['versions'] ) { return movies[movie].versions[version]; }
类型检查效果
- 合法调用:
getMovieVersion("Shawshank Redemption", "Directors Cut")会被TypeScript认可,返回对应版本的数据 - 非法调用:
getMovieVersion("The Dark Knight", "Cinema")会直接报错,因为"The Dark Knight"不存在"Cinema"这个版本键
这种方式能确保传入的版本键始终对应所选电影的有效版本,完全符合类型安全要求。
内容的提问来源于stack exchange,提问作者magicmn
相关产品推荐
相关产品推荐

