【发布时间】:2021-09-09 00:20:15
【问题描述】:
我有一个函数,它接受类似结构的参数,并且在函数内部使用类型保护来确定传入参数的类型。
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 中,我可以看到 TS 正确理解了以下块中的 example
if (isEx1(example)) {
return example;
}
是正确的类型
(参数)示例:Ex1
您可以看到分配给example的对象是从函数返回的,在本例中分配给test。
然而,尽管理解了返回块中的正确类型,Typscript 不会将 test 分配为类型 Ex1,而是将其分配为更广泛的类型 Ex。
const test = exampleFunc(ex1);
表示下面会抛出错误
test.param1
类型“Ex”上不存在属性“param1”。
类型保护仅在当前执行块中有用还是我误解了它们的用途?
【问题讨论】:
标签: typescript types narrowing typeguards