TypeScript如何实现函数返回与输入LocationMap同键结构的对象
TypeScript 函数返回结构与输入LocationMap匹配的类型约束实现
你可以通过泛型捕获输入对象的具体结构,再绑定返回值类型来实现需求,核心实现如下:
export interface LocationMap { [displayKey: string]: string[]; } // 泛型T继承LocationMap,同时保留传入对象的具体键结构 function bar<T extends LocationMap>(map: T): T { // 执行业务逻辑 // 示例实现:遍历所有输入键,统一生成返回值 return Object.fromEntries( Object.keys(map).map(key => [key, ['自定义返回的字符串数组']]) ) as T; }
效果验证
你可以用以下代码测试类型约束效果:
// 定义输入对象,用satisfies保证符合LocationMap规范,同时保留原始键结构 const input = { foo: ['bar', 'baz'], addr: ['beijing', 'shanghai'] } satisfies LocationMap; const output = bar(input); // 此时output的类型会被自动推导为:{ foo: string[], addr: string[] } // 如果返回对象缺少foo/addr任意一个键,或者新增其他未在input中定义的键,TS都会直接抛出类型错误
核心说明
- 泛型
T extends LocationMap的作用有两个:一是限制输入参数必须符合LocationMap的基础结构(所有值都是字符串数组),二是不会被LocationMap的字符串索引抹除输入对象的具体键信息,能完整捕获传入的键集合 - 返回值声明为
T类型,就强制要求返回对象的键集合、每个键对应的值类型和输入完全一致 - 如果需要更严格的约束(比如返回数组的元素/长度也和输入绑定),可以给输入对象加上
as const声明,再将泛型调整为T extends Readonly<LocationMap>即可。
内容的提问来源于stack exchange,提问作者nossonh
相关产品推荐
相关产品推荐

