1

在 Power Query (M) 中,我发现了两种声明类型的方法:myVar as typetype text

每个似乎都适用于不同的环境。例如:

Table.AddColumn(myTable, "NewName", each [aColumn], type text)

或者

MyFunc = (aParam as any) as date => Date.From(aParam)

但是,这不适用于更复杂的类型,例如{text}or {number},这将是仅包含文本值或仅包含数字的列表。我可以将这些类型与type语法一起使用,但不能使用as type语法。

为什么不?

此外,在 M 中声明类型是否会对性能产生任何影响,或者只是在传递/返回不正确的类型时引发错误?

4

1 回答 1

2

在“M”中声明类型通常应该对性能影响很小,并且会使您的函数更加“自我记录”。

调用函数时,会检查函数参数类型“kind”,而不是自定义的完整类型定义。因此,将数字列表传递给需要文本列表的函数不会导致任何错误。你可以看到一些“M”:

let
    FunctionType = type function (l as { text }) as any,
    UntypedFunction = (l) => l{0},
    TypedFunction = Value.ReplaceType(UntypedFunction, FunctionType),
    Invoked = TypedFunction({0, 1, 2})
in
    Invoked

不检查递归类型对性能有好处,因为检查列表的每个元素需要遍历整个列表。

当你写一个像这样的函数值时,(l) => l{0}你只能使用像as list和 not这样的原始类型as { text }。我认为这个限制是为了引导函数作者不要设置函数不会遵守的类型限制。

您可以在语言规范中阅读更多关于语法允许的内容。(如果该链接失效,您应该能够关注MDSN的 PDF 链接。)

于 2016-11-11T20:59:39.687 回答