考虑以下示例:
typedef Action<T> = void Function(T arg);
void execute<T>(T arg, Action<T> action) => action(arg);
void main() {
execute(42, (value) => print(value.bar));
}
我希望Dart Analyzer在value.bar
处失败,因为可以将T
推断为number
。相反,Dart不会将T
推断为number
,而是会退回到dynamic
。
在Dart中是否有一种方法可以进行参数驱动的类型推断?
如果没有,是否有列表禁止默认为dynamic
的方法?
编辑:
TypeScript中的等效示例:
type Action<T> = (arg: T) => void;
function execute<T>(arg: T, action: Action<T>) {
return action(arg);
}
function main() {
execute(42, (value) => console.log(value.bar));
}
屈服误差
Property 'bar' does not exist on type 'number'.
Kotlin中的等效示例:
typealias Action<T> = (arg: T) -> Unit;
fun<T> execute(arg: T, action: Action<T>) = action(arg);
fun main() {
execute(42) { value -> print(value.bar) };
}
屈服误差
Unresolved reference: bar
答案 0 :(得分:0)
在运行时dart vm将T推断为number。在编码中,您可以这样做:
typedef Action<T> = void Function(T arg);
void execute<T>(T arg, Action<T> action) => action(arg);
void main() {
execute<number>(42, (value) => print(value));
}
答案 1 :(得分:-1)
我调查了这个问题,发现如果您只是写
execute(42, (value) => print(value));
则类型将正确推断为int
。我相信,在尝试推断类型时,分析器会寻找能够同时匹配两个参数的最小类型。它可以从第一个参数推断它必须至少为int
。但是,当它在第二个参数上分析lambda时,它推断value
不能为{{1},因为int
不具有int
,因此它会退回到{{1 }}是该类型参数唯一可以使用的类型。
如果您认为这不是类型推断的工作方式,则应向sdk提交问题:https://github.com/dart-lang/sdk/issues