根据参数类型

时间:2019-06-11 09:45:23

标签: dart

考虑以下示例:

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

2 个答案:

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