为什么这个打字稿打字机不起作用

Why does this typescript typeguard not work

我有以下代码

const validProtocols = ["https", "http"] as const
type AllProtocols = typeof validProtocols
type Protocol = AllProtocols[number]
function isProtocol(p:unknown): p is Protocol{
  return typeof p === "string" && p in validProtocols
}

let parse = (p:string)=>{
  if(isProtocol(p))
    return p
  else
    throw `${p} is not a protocol`
}

console.log(parse("https"))

代码编译但最后一行抛出异常,因为 isProtocol(p) 返回 false。怎么了?

该代码用于验证编译器控制之外的输入,即:环境变量。

in 运算符检查对象上是否存在 属性。例如:

const obj = { prop: 'val' };
const arr = ['val'];

console.log('prop' in obj, 0 in arr);

它不检查,只检查属性。要检查数组中的值,请使用 .includes(并且您还必须解决 ugly type rules for .includes 问题,这使得这些检查比人们预期的要混乱得多):

function isProtocol(p:unknown): p is Protocol{
  return typeof p === "string" && (validProtocols as unknown as Array<string>).includes(p)
}