Typescript 如何实现PromiseLike接口?
我尝试在表支持下实现一个自动提交过程。但我无法绕过上次投诉的类型错误:Typescript 如何实现PromiseLike接口?,typescript,Typescript,我尝试在表支持下实现一个自动提交过程。但我无法绕过上次投诉的类型错误: type JobResolve = () => void export class Job implements PromiseLike<JobResolve> { public then<TResult1 = JobResolve>(onfulfilled?: ((value: JobResolve) => (PromiseLike<TResult1> | TResul
type JobResolve = () => void
export class Job implements PromiseLike<JobResolve> {
public then<TResult1 = JobResolve>(onfulfilled?: ((value: JobResolve) => (PromiseLike<TResult1> | TResult1)) | undefined | null): PromiseLike<TResult1> {
const done = () => {}
if (typeof onfulfilled === 'function') {
const thenable = Promise.resolve(onfulfilled(done))
done()
return thenable
} else {
// Error here!
// TS2322: '() => void' is assignable to the constraint of type 'TResult1', but 'TResult1' could be instantiated with a different subtype of constraint '{}'.
return Promise.resolve(done)
}
}
}
type JobResolve=()=>void
导出类作业实现PromiseLike{
public-then(oncompleted?:((值:JobResolve)=>(PromiseLike | TResult1))|未定义| null):PromiseLike{
const done=()=>{}
if(typeof oncompleted==='function'){
const thenable=Promise.resolve(完成时)
完成()
返回表格
}否则{
//这里出错了!
//TS2322:“()=>void”可分配给“TResult1”类型的约束,但“TResult1”可以用约束“{}”的不同子类型实例化。
返回承诺。解决(完成)
}
}
}
如何解决?(无
承诺。解决(如有)
)您的else
分支在承诺的定义中显示出弱点。
考虑一下,
异步函数f(){
设t:{a:string}=wait Promise.resolve(1.then();
控制台日志(t,t.a,类型t,类型t.a);
}
f();
t
的类型是number
而不是object
,但是类型系统认为它是一个object
如果您的目标是遵守承诺
,那么您最好将返回值转换为返回类型,如下所示:
回报承诺。像承诺一样解决(完成)
或者,为了安全起见,抛出一个异常。您的
else
分支在PromiseLike
的定义中显示了一个弱点。
考虑一下,
异步函数f(){
设t:{a:string}=wait Promise.resolve(1.then();
控制台日志(t,t.a,类型t,类型t.a);
}
f();
t
的类型是number
而不是object
,但是类型系统认为它是一个object
如果您的目标是遵守承诺
,那么您最好将返回值转换为返回类型,如下所示:
回报承诺。像承诺一样解决(完成)
或者,为了安全起见,抛出一个异常。我认为这是典型的泛型问题,您需要创建泛型类型的某些内容,但当然,您没有最终泛型类型的具体视图(它肯定是
Job
中的jobsolve
,但是Job
子类可能会使它变成其他类型,然后done
将不是正确的类型)。(顺便说一句,if
分支看起来有点不对劲--done
会被调用两次……虽然它什么都不做,但这并不重要。不过,我假设它在实际代码中确实做了一些事情。)我认为这是典型的泛型问题,您需要创建泛型类型的东西,但是当然,您没有最终泛型类型的具体视图(它肯定是Job
中的jobsolve
,但是Job
子类可能会使它变成其他类型,然后done
将不是正确的类型)。(顺便说一句,if
分支看起来有点不对劲--done
会被调用两次……虽然它什么都不做,但这并不重要。不过,我假设它在实际代码中确实做了一些事情。)