Typescript如何确保函数返回值为指定类型解决联合类型赋值报错
解决方案
问题本质是默认情况下TypeScript无法根据入参的布尔值自动推导对应的返回类型,只会将返回值推导为string | Date联合类型,因此赋值给固定类型的变量时会触发类型报错,可通过以下两种类型安全的方式解决:
方案1:使用函数重载(最直观)
适合参数分支明确的场景,先声明不同入参对应的返回类型,再写函数实现,调用时TS会自动匹配对应重载规则:
// 重载签名:明确不同入参对应的返回类型 function getStringOrDate(asString: true): string function getStringOrDate(asString: false): Date function getStringOrDate(): string // 适配默认参数无入参的调用场景 // 实现签名 function getStringOrDate(asString = true) { if (asString) { return new Date().toLocaleDateString() } else { return new Date() } } // 调用时自动推导对应返回类型,无报错 const dateStr = getStringOrDate(true) // 推导类型为string const today = getStringOrDate(false) // 推导类型为Date const defaultRes = getStringOrDate() // 推导类型为string
方案2:使用泛型+条件类型(更简洁,适合箭头函数)
如果习惯使用箭头函数,用泛型绑定入参和返回值的关系更便捷:
const getStringOrDate = <T extends boolean = true>(asString: T = true as T): T extends true ? string : Date => { if (asString) { return new Date().toLocaleDateString() as T extends true ? string : Date } else { return new Date() as T extends true ? string : Date } } // 调用效果和重载完全一致 const today: Date = getStringOrDate(false) // 无类型报错
内容的提问来源于stack exchange,提问作者Bishonen_PL
相关产品推荐
相关产品推荐

