繁体   English   中英

Typescript 将定义的值推断为未定义

[英]Typescript inferring defined value as undefined

我有以下数组,它可以是 object 或未定义。 即使在过滤结果以包含所有定义的值之后,typescript 仍然表示它可能未定义

interface Bob {
    name: string;
}

type BobDetails = undefined | Bob;

const myArray: BobDetails[] = [{ name:  "Bob"}, undefined];
myArray[0].name; // expected Object is possibly 'undefined'.(2532)

var filter = myArray.filter(arr => arr?.name);
filter[0].name; // still Object is possibly 'undefined'.(2532)

如何使 Typescript 知道filter[]将只有 Bob[] 而没有 undefined。 我知道我们可以用! 但我希望正常流程能够实现它。

Typescript 游乐场示例

为此,您需要让过滤器 function 成为自定义类型防护 现在, arr => arr?.name只是一个返回string | undefined的 function。 string | undefined 你和我可以弄清楚这对结果数组有什么影响,但 typescript 需要更多。

如果你改变 function 让它返回一个 boolean,并且你给它特殊的返回类型arr is Bob ,那么 typescript 知道如果返回true ,那么它可以推断出 arr 是一个Bob filter 方法知道这将导致Bob[]

var filter = myArray.filter((arr): arr is Bob => arr?.name !== undefined);

游乐场链接

想象数组是: BobDetails[] = [undefined, undefined];

然后过滤[0].name; 也将是未定义的。 为简单起见,您可以将过滤器的长度检查为:

if(filter.length>0){ filter[0].name; ... your code}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM