TypeScript中如何复用已定义的FindPerson类型通过ID获取Person对象
你之前的写法存在认知偏差:FindPerson是函数类型,用来约束「根据ID查Person的函数」的入参和返回值结构,本身不能直接用来做数据转换,你把普通对象强制断言成FindPerson类型,当然只会得到函数类型的对象,拿不到Person实例。
具体实现方案如下:
1. 先实现符合FindPerson类型的查询函数
你需要先编写实际的查询逻辑,符合FindPerson的类型约束,示例如下:
// 示例Person类型定义,和你的实际定义对齐即可 type Person = { id: string name: string // 其他Person字段 } export type FindPerson = (personId: string) => Person | undefined; // 你的人员数据源,可根据实际场景替换为接口请求、本地缓存等逻辑 const personList: Person[] = [ { id: "1923-01-01a", name: "张三" }, { id: "1999-02-02b", name: "李四" } ] // 实现符合FindPerson类型的查询函数 const findPerson: FindPerson = (personId) => { return personList.find(item => item.id === personId) }
2. 调用函数获取Person对象
直接传入ID调用上面实现的函数即可得到对应Person对象:
// 单个ID查询 const person = findPerson("1923-01-01a") // person类型为 Person | undefined,符合预期 // 多个ID批量查询 const ids = ["1923-01-01a", "1999-02-02b", "不存在的id"] const personResult = ids.map(id => findPerson(id)) // 过滤掉未查到的undefined项,得到纯Person数组 const validPersons = personResult.filter((item): item is Person => Boolean(item))
3. 单独复用FindPerson的返回值类型
如果你不需要定义函数,只是想复用FindPerson里的Person类型定义,可以用TS内置的ReturnType工具类提取:
// 提取FindPerson的返回值类型,等价于 Person | undefined type PersonOrUndefined = ReturnType<FindPerson> // 进一步提取NonNullable的纯Person类型,等价于 Person type PurePerson = NonNullable<ReturnType<FindPerson>>
内容的提问来源于stack exchange,提问作者Frances
相关产品推荐
相关产品推荐

