为什么这个打字稿打字机不起作用
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)
}
我有以下代码
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)
}