【发布时间】:2014-06-21 20:34:34
【问题描述】:
下面的代码中有很多行文本的错误。当我将箭头标记行中泛型的Y参数更改为数字或字符串等类型时,一切正常,编译后没有错误
问题 1 - 它是编译器错误吗? 问题 2 - 如何修复错误?
class channel<S,Y>{
public merge(...channels:channel<any, Y>[]) {
var ch = new channel<void, channel<any, Y>>(); // <---
var result = ch.flatMap(x => x);
return result;
}
public flatMap<R>(projector: (data: Y) => channel<any, R>): channel<Y, R> {
return null;
}
}
预期的结果类型是channel<any, Y>,但编译器会推断出不同的结果
错误信息:
Error 1 Supplied parameters do not match any signature of call target:
Call signatures of types '(x: channel<any, channel<any, Y>>) => channel<any, channel<any, Y>>' and
'(data: channel<any, channel<any, Y>>) => channel<any, Y>' are incompatible:
Types 'channel<any, channel<any, Y>>' and 'channel<any, Y>' originating in infinitely expanding type reference have incompatible type arguments.
更新
public flatMap<R>(projector: (data: Y) => channel<any, R>): channel<any, R> {} // changed Y to any
public correct(...targets: channel<any, Y>[]) {
var ch = new channel<void, channel<any, Number>>().named('merge');
var result = ch.flatMap(x => x);
return result;
}
public incorrect(...targets: channel<any, Y>[]) {
var ch = new channel<void, channel<any, Y>>().named('merge'); // changed Number to Y
var result = ch.flatMap(x => x); // error
return result;
}
那里有一些魔法。当我这样改变时,我得到了 (x:Number):Number => x 。但是当使用 Y 时,x 是channel<any, channel<any,Y> >
【问题讨论】:
-
named的定义是什么? -
我是
public named(name: string) {/*skip*/ return this; } -
确实,我犯了一个错误。我解决了一些问题,但主要问题仍然存在
-
创建了具有正确描述的新线程stackoverflow.com/questions/23478801/…
标签: types typescript