Typescript中的变量需要类型注解

unhi4e5o  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(170)

我想禁用Typescript中变量的类型推断,但找不到任何方法。
我之所以要这样做,主要是因为迁移到承诺。
有时候我有这样的代码:

myFunction() : string {
  ....
  return "some string";
}
const x = myFunction();
if(x != undefined){
  do_something_important;
}

它工作正常,x的类型是字符串,类型检查正常,一切正常。
但如果出于某种原因,我需要更改myFunction以返回Promise而不是直接值,那么我会更改它,但是:

myFunction() : Promise<string> { //or async myFunction()...
  ....
  return some_promise;
}
const x = myFunction();  //Now x is a Promise!!, no warning!
if(x != undefined){      //x will never be undefined!!
  do_something_important;
}

由于x的类型是推断出来的,所以不会抛出错误或警告,现在x永远不会是未定义的,我的代码会做意想不到的事情,所以,我需要记住改变我使用myFunction的地方,并像这样声明变量:

const x : string = myFunction()

然后它会进行验证并显示一个警告,说明promise不能赋值给字符串!!所以我将它修改为如下形式:

const x : string = await myFunction()

**这太棒了!**现在它可以按预期工作了,但是因为typescript没有强迫我显式声明变量的类型,所以我总是忘记这样做,而且经常我不得不使用promises,同样的场景重复出现。我认为当使用常量值时,比如数字或字符串,比如let x = 0;,不需要声明类型是可以的。但是对于函数来说,它可能会变得非常棘手,特别是如果它们返回的承诺或类型可以在它们之间兼容的话。
是否有办法禁用类型推断并强制我声明变量类型?

我想我可以设置平面noImplicitAny标志,并且在声明时不初始化变量,但这将阻止我使用const,除了使代码更丑陋,而且,非常容易忘记,所以不是一个真正的解决方案。

ckx4rj1h

ckx4rj1h1#

Typescript功能更强大,它提供了使用"|'关键字。

myFunction() : Promise<string> { //or async myFunction()...
  ....
  return "some string";
}
const x = myFunction();  //Now x is a Promise!!, no warning!
if(x != undefined){      //x will never be undefined!!
  do something;
}

const x: any = await myFunction();

export type defaultType = Promise<String> | String | Number | ...;
const x: defaultType = await myFunction();

相关问题