破碎的代码:
ngOnInit(){
Observable.fromEvent(this.el.nativeElement, 'keyup')
.map((e:any) => {e.target.value})
.filter((text:string) => text.length < 3)
.debounceTime(250)
.do(() => this.loading.next(true))
//search youtube
.map((query: string)=> {this.youtube.search(query)})
}
错误:
[TS] 类型参数“T”的类型参数不能从用法中推断出来。考虑明确指定类型参数。 类型参数候选'void'不是有效的类型参数,因为它不是候选'string'的超类型。 任何
修正:
如果我从e.target.value(第3行)删除花括号,一切正常。为什么会这样?
答案 0 :(得分:1)
来自C#背景,但我认为同样的逻辑适用于TypeScript。
大括号允许您在lambda中输入多行代码,例如
.map((e:any) => {
console.log('Hello');
return e.target.value;
})
这意味着在使用花括号时需要使用return e.target.value;
,以便代码块返回一个值以满足map
函数的要求。
不使用大括号会导致e.target.value
调用中隐式返回map
,因此无需包含return
。
答案 1 :(得分:0)
它们对应ES6 arrow function的2种语法,即:
(param1, param2, …, paramN) => { statements }
(param1, param2, …, paramN) => expression
这使得tsc
推断的返回类型不同:
.map((e:any) => {e.target.value})
~~~~~~~~~~~~~~~~~~~~~~~~~~~
an arrow function that have no return, and effectively returns undefined.
TypeScript compiler infers such function to have return type "void".
.map((e:any) => e.target.value)
~~~~~~~~~~~~~~~~~~~~~~~~~
an arrow function that returns e.target.value
the compiler inters the return type to be "any"