如何定义根据dataKey动态指定返回类型的TypeScript含函数接口?
实现基于dataKey动态确定loadData返回类型的TypeScript接口
你可以通过泛型来实现这个需求,把dataKey的具体值作为泛型参数约束,让TypeScript根据这个参数推导出loadData的返回类型。
修改后的接口定义
interface IConfigParams<K extends string> { dataKey: K; loadData: () => Promise<{ [key in K]: any }>; }
核心逻辑说明
- 泛型
K extends string用来约束dataKey必须是字符串类型的具体值,避免任意字符串导致类型推导失效 { [key in K]: any }是映射类型,会根据K的实际值生成对应结构的对象类型:比如当K为'list'时,该类型就是{ list: any }
使用示例
1. 直接声明符合接口的对象
// dataKey为'list'时,loadData返回类型自动推导为Promise<{ list: any }> const listConfig: IConfigParams<'list'> = { dataKey: 'list', loadData: async () => { return { list: [1, 2, 3] }; } }; // dataKey为'user'时,返回类型自动变为Promise<{ user: any }> const userConfig: IConfigParams<'user'> = { dataKey: 'user', loadData: async () => { return { user: { id: 1, name: 'Alice' } }; } };
2. 函数参数中自动推导类型
如果把IConfigParams作为函数参数类型,TypeScript会自动根据传入的dataKey值完成类型推导:
function processConfig<K extends string>(config: IConfigParams<K>) { return config.loadData(); } // 调用时,返回值类型自动识别为Promise<{ list: any }> const result = processConfig({ dataKey: 'list', loadData: async () => ({ list: [] }) });
3. 进阶:指定值的具体类型
如果需要替换any为更严格的类型,可以新增一个泛型参数来约束值的类型:
interface IConfigParams<K extends string, V> { dataKey: K; loadData: () => Promise<{ [key in K]: V }>; } // 示例:指定list的值为number数组类型 const strictListConfig: IConfigParams<'list', number[]> = { dataKey: 'list', loadData: async () => ({ list: [1, 2, 3] }) };
内容的提问来源于stack exchange,提问作者Kent Wood
相关产品推荐
相关产品推荐

