TypeScript错误。已修复但无法解释

时间:2017-04-27 09:40:15

标签: typescript

破碎的代码:

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行)删除花括号,一切正常。为什么会这样?

2 个答案:

答案 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"