使用双泛型键关联数据子集时子键类型解析为any的问题咨询
使用双泛型键关联数据子集时子键类型解析为any的问题咨询
嗨各位TypeScript大神,最近在写项目的时候碰到一个类型推断的坑,折腾了半天没搞定,来求助一下!
先给大家展示下我的数据结构:
import { ParasiteDescription, LookBackDescription } from '@/movies/static'; import type { MovieGenre, MovieDescription } from '@/movies/types'; const movies = { drama: { parasite: { description: ParasiteDescription, director: 'Bong Joon Ho', } }, animation: { 'Look Back': { description: LookBackDescription, director: 'Tatsuki Fujimoto' } }, comedy: { 'The Grand Budapest Hotel': { description: 'A whimsical tale about a famous hotel concierge', director: 'Wes Anderson' } } };
我想要实现一个函数,传入电影类型(比如drama)和对应类型下的电影键名(比如parasite),就能返回对应的电影数据。最开始我写了这样的泛型函数:
function getMovie<G extends keyof typeof movies, M extends keyof typeof movies[G]>(genre: G, movieKey: M): MovieDescription { return movies[genre][movieKey]; }
但问题来了——当我调用这个函数的时候,第二个参数movieKey的类型总是被解析成any,或者说没办法根据第一个参数的genre来自动约束可选值。比如我传入genre: 'drama'时,movieKey应该只能选'parasite'才对,但现在编辑器根本不会给出正确的提示,甚至传个不存在的键也不会报错。
我试过调整泛型的写法,比如把两个泛型关联起来,但好像没找对路子。有没有大佬能指点一下,怎么才能让TypeScript正确关联这两个参数的类型,根据第一个genre的类型来限制第二个movieKey的可选范围呀?
备注:内容来源于stack exchange,提问作者corvid
相关产品推荐
相关产品推荐

