[英]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。 我知道我们可以用!
但我希望正常流程能够实现它。
为此,您需要让过滤器 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.