以下打字稿代码具有正确的“外部”签名,但两个return
语句返回错误(playground)。
export function using<F, R = void | Promise<void>>(
value: F,
init: (value: F) => R
): R extends Promise<void> ? Promise<F> : F {
const r = init(value)
if (r === undefined) return value
return r.then(() => value)
}
known-as-bmf建议的一个简单解决方法是使用函数重载,例如:
export function using<F>(value: F, init: (value: F) => Promise<void>): Promise<F>
export function using<F>(value: F, init: (value: F) => void): F
export function using<F>(value: F, init: (value: F) => void | Promise<void>): F | Promise<F> {
const r = init(value)
if (r === undefined) return value
return r.then(() => value)
}
但是然后您在函数实现中有点松散了强类型检查,例如,以下无效,但不返回任何编译错误:
export function using<F>(value: F, init: (value: F) => Promise<void>): Promise<F>
export function using<F>(value: F, init: (value: F) => void): F
export function using<F>(value: F, init: (value: F) => void | Promise<void>): F | Promise<F> {
const r = init(value)
if (r === undefined) return Promise.resolve(value)
return r.then(() => value)
}
有没有一种方法可以使第一段代码全部正常工作,同时保持强类型验证?
答案 0 :(得分:1)