Angular 试图理解以下代码:map((data:SearchResponse)=>;data&;data.items | |[])
我是Angular的新手,正在尝试通过检查代码样本来学习。我为ngx Typeahead提取了一些示例代码,并试图理解这些代码Angular 试图理解以下代码:map((data:SearchResponse)=>;data&;data.items | |[]),angular,typescript,angular11,Angular,Typescript,Angular11,我是Angular的新手,正在尝试通过检查代码样本来学习。我为ngx Typeahead提取了一些示例代码,并试图理解这些代码 interface SearchResponse { total_count: number; incomplete_results: boolean; items: Owner[]; } 然后 读取类似“将响应映射到此函数并将其称为“数据”的内容。然后使用此函数,并将其与项(SearchResponse的一个元素)一起读取。如果该和为空,则返回一个空数组
interface SearchResponse {
total_count: number;
incomplete_results: boolean;
items: Owner[];
}
然后
读取类似“将响应映射到此函数并将其称为“数据”的内容。然后使用此函数,并将其与项(SearchResponse的一个元素)一起读取。如果该和为空,则返回一个空数组。“那么如果它不是空的呢?”?“data&&data.items产生了什么?或者我是不是想得太多了,data&&data.items会返回true,所以整个数据项都会返回?使用
&&
和|
这样的方法是if
/else
检查值或获取默认值的缩写
data&&data.items | |【】
与if(data&&data.items)data.items else【】
(或(data&&data.items)?data.items:【】
。也就是说,如果定义了数据且数据.items
没有错误(例如非空数组),您将获得数据。items
。否则,您将获得一个空数组
这是因为在Typescript中,&&
和| |
运算符始终返回其参数之一:
a和&b
为a
如果a
为假,或b
- 如果
a
是真实的,或者b
而且,由于它们会短路(仅在需要时计算操作数),所以可以使用它们在访问某个值之前检查该值
这意味着,如果data.items
存在且非空,data&&data.items
将是该值。否则,它将是一个伪值,(该值)|【】
将成为空数组——默认值。正确-假设“data”存在且data.items存在,它将返回data.items处的值(我假设它是一个数组)-否则它将返回一个空数组。这是一个速记,以确保您使用的是正确定义的值,在本例中为数组。当使用对象作为这样的条件时,如果对象存在,它的行为就好像它是True
,如果它不存在,它的行为就好像它是False
(即空、未定义、0等)如果data
是一个非空的已定义对象,则该语言处理该对象的另一端。如果data.items
是一个非空的已定义对象,则表达式短路。true&&true | | |?
不需要处理第三个元素就知道表达式的计算结果为true。但表达式不返回true
,它返回上一次计算的条件,因此如果data
和data.items
都是非空的定义对象,它将返回data.item
如果data
是一个事物而data.item
不是呢?那么我们有true&&false | | |?
可以短接到false | | | |?
。短路还没有开始,所以我们必须评估第三个条件:空数组。空数组是一个非空的、已定义的事物,因此它的作用是true。它也是计算最后一个表达式以返回空数组
如果data
和data.items
都不包含值,则返回空数组
我认为数据
不可能为空或未定义,数据项
不可能抛出错误
实际上,所有这些都相当于说“我想要数据.items
,但如果它没有定义,给我一个空数组。”这是一种利用JS引擎进行的奇特类型的强制。我构建了一个基本测试,看看它是如何工作的,映射((数据:SearchResponse)=>数据和数据.items | |[])
映射数据之后(truthy和数据,项(truthy)将通过{},在其他情况下,将通过[]进行链接
//let data={“items”:null}//[]
让数据={“项”:{}/{}
//数据=null/[]
//让数据=未定义//[]
console.log(data&data.items | |【】)
数据和data.items
将返回数据。如果数据不为空,items
将返回数据。使用数据和data.items |【】
时,如果数据为空或data.items为空/不存在,则返回空数组。
this.suggestions$ = new Observable((observer: Observer<string>) => {
observer.next(this.search);
}).pipe(
switchMap((query: string) => {
if (query) {
return this.http.get<SearchResponse>('https://localhost:5001/api/GetOwners', {
params: { q: query }
}).pipe(
map((data: SearchResponse) => data && data.items || []),
tap(() => noop, err => { this.errorMessage = err && err.message || 'Something goes wrong'; })
);
}
return of([]);
})
);
map((data: SearchResponse) => data && data.items || [])