类型不会从使用类型保护的函数中缩小
Type is not narrowed from function using type guards
我有一个函数接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。
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()
}
在我的实际应用中,return编辑了一个不同类型的复杂对象,但在这个例子中,我只是return同一个对象。
当我执行函数时
const ex1: Ex1 = {
contents: 'contents',
param1: 'yes'
}
const test = exampleFunc(ex1);
在我的 IDE 中,我可以看到 TS 正确理解了以下块中的 example
if (isEx1(example)) {
return example;
}
类型正确
(parameter) example: Ex1
您可以看到分配给 example
的对象是从函数中 return 编辑的,在本例中分配给 test
。
然而,尽管理解 return 块中的正确类型,Typscript 并没有将 test
分配为类型 Ex1
而是将其分配为更广泛的类型 Ex
.
const test = exampleFunc(ex1);
这意味着下面会抛出一个错误
test.param1
Property 'param1' does not exist on type 'Ex'.
类型保护仅在当前执行块中有用,还是我误解了它们的用法?
缩小仅适用于它发生的本地范围。由于您的 exampleFunc
声明它 returns 为 Ex
,类型系统会将其视为 Ex
,而不管函数内部发生了什么。
我有一个函数接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。
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()
}
在我的实际应用中,return编辑了一个不同类型的复杂对象,但在这个例子中,我只是return同一个对象。
当我执行函数时
const ex1: Ex1 = {
contents: 'contents',
param1: 'yes'
}
const test = exampleFunc(ex1);
在我的 IDE 中,我可以看到 TS 正确理解了以下块中的 example
if (isEx1(example)) {
return example;
}
类型正确
(parameter) example: Ex1
您可以看到分配给 example
的对象是从函数中 return 编辑的,在本例中分配给 test
。
然而,尽管理解 return 块中的正确类型,Typscript 并没有将 test
分配为类型 Ex1
而是将其分配为更广泛的类型 Ex
.
const test = exampleFunc(ex1);
这意味着下面会抛出一个错误
test.param1
Property 'param1' does not exist on type 'Ex'.
类型保护仅在当前执行块中有用,还是我误解了它们的用法?
缩小仅适用于它发生的本地范围。由于您的 exampleFunc
声明它 returns 为 Ex
,类型系统会将其视为 Ex
,而不管函数内部发生了什么。