我有一个函数,它接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。
type Ex1 = {
contents: 'contents',
param1: 'yes'
}
type Ex2 = {
contents: 'contents',
param2: true
}
type Ex = Ex1 | Ex2;
export const exampleFunc = (example: Ex): Ex => {
const isEx1 = (unknownExample: Ex): unknownExample is Ex1 => {
return (unknownExample as Ex1).param1 === undefined ? false : true;
}
const execute = (): Ex => {
if (isEx1(example)) {
return example;
}
return example;
}
return execute()
}
在我的实际应用中,返回了一个不同类型的复杂对象,但在这个例子中,我只是返回了同一个对象。
当我执行该功能
const ex1: Ex1 = {
contents: 'contents',
param1: 'yes'
}
const test = exampleFunc(ex1);
在我的 IDE 中,我可以看到 TSexample
在以下块中正确理解了这一点
if (isEx1(example)) {
return example;
}
是正确的类型
(参数)示例:Ex1
您可以看到分配给的对象example
是从函数返回的,在这种情况下分配给test
。
然而,尽管理解了返回块中的正确类型,但 Typscript 并没有将其分配test
为 typeEx1
而是将其分配为更广泛的 type Ex
。
const test = exampleFunc(ex1);
这意味着以下会引发错误
test.param1
类型“Ex”上不存在属性“param1”。
类型保护仅在当前执行块中有用还是我误解了它们的使用?