TypeScript基于布尔选项参数实现箭头函数返回类型缩小
问题根源
你现有类型签名的问题在于,条件判断直接使用了CreateDocumentListOptions["withVersions"]的固定类型boolean | undefined,该类型永远不满足extends true的条件,所以无论传入什么参数,TypeScript都会判定返回值固定为Document[]类型。
解决方案
你只需要给函数类型加上泛型约束,动态捕获传入参数的实际类型即可,修改后的类型定义如下:
type CreateDocumentListOptions = { withVersions?: boolean; }; // 新增泛型T捕获入参的实际类型 type CreateDocumentList = <T extends CreateDocumentListOptions>( options?: T ) => T["withVersions"] extends true ? DocumentWithVersions[] : Document[]; // 原有函数实现不需要任何修改 const createDocumentList: CreateDocumentList = ({ withVersions = false } = {}) => times( withVersions ? createDocumentWithVersions : createDocument, chance.natural({ min: 1, max: 10 }) );
修改完成后,调用createDocumentList({ withVersions: true })时,TypeScript会自动推断泛型T的withVersions属性为字面量类型true,因此返回值类型会自动推导为DocumentWithVersions[],类型报错即可解决。
内容的提问来源于stack exchange,提问作者Kosmotaur
相关产品推荐
相关产品推荐

