Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何实现PromiseLike接口?_Typescript - Fatal编程技术网

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
会被调用两次……虽然它什么都不做,但这并不重要。不过,我假设它在实际代码中确实做了一些事情。)