Power Query 类型定义

Power Query Type Definition

在 Power Query (M) 中,我找到了 2 种声明类型的方法:myVar as typetype text

每个似乎都适用于不同的上下文。例如:

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

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

但是,这对于更复杂的类型(例如 {text}{number})不起作用,因为它们将是仅包含文本值或仅包含数字的列表。我可以通过 type 语法使用这些类型,但不能使用 as type 语法。

Why/not?

此外,在 M 中声明类型是否会影响性能,或者如果类型不正确 passed/returned 是否只是引发错误?

在 "M" 中声明类型通常对性能影响很小,并且会使您的函数更多 "self-documenting"。

调用函数时,会检查函数参数类型 "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 而不是 as { text } 这样的原始类型。我认为此限制旨在指导函数作者不要设置函数不会遵守的类型限制。

您可以在 Language Specification. (If that link dies you should be able to follow the PDF link from MDSN 中阅读更多关于语法允许的内容。)