如何检查字符串是否属于TypeScript中的类型?

时间:2018-10-10 15:50:43

标签: typescript web-audio

网络音频API具有自己的类型,其中之一是BiquadFilterType

type BiquadFilterType = "lowpass" | "highpass" | "bandpass" | "lowshelf" | "highshelf" | "peaking" | "notch" | "allpass"

我正在使用a来让用户选择他或她将使用哪种类型。因此,我做了一个函数(从选择器中接收一个字符串)并将biquadfilter.type设置为接收值,因此我必须给它一个签名,例如

setValue(value: BiquadFilterType) ...

但是当我尝试在选择器为ts的地方调用我的函数时,我抱怨在给该函数一个字符串时,它期望BiquadFilterType。是否有任何方法可以检查(在我的函数内部)接收到的参数的类型(我尝试过typeof和instanceof,但似乎对TS没有意义),以便TS知道我正确使用了它?

1 个答案:

答案 0 :(得分:1)

Typescript会编译为Javascript,并且在发生这种情况时会删除所有类型。因此,验证输入的唯一方法是在运行时通过类型卫士手动进行。

function isBiquadFilter(value: string = ""): value is BiquadFilterType {
  switch(value) {
     case "lowpass":
     case "highpass":
     ...
     case "allpass":
        return true;
     default:
        return false;
  }
}

然后,如果将其放在if语句中,Typescript将很高兴:

const filter: string = getBiquadFilterFromUntrustedSource();
if (isBiquadFilter(filter)) {
   // filter is now casted as type BiquadFilterType
   setValue(filter);
} else {
   // filter is now casted as string. Handle appropriately.
}

或者,如果您希望在setValue部分使用它,

function setValue(filter) {
   if (isBiquadFilter(filter)) {
      // Perform Action
   } else {
      // throw error
   }
}