任何函数值都符合原始类型function
,它对函数的形参类型或函数返回值的类型没有任何限制。自定义函数类型值用于对符合函数值的签名设置类型限制。
函数类型:
function (
参数规范列表选择 )
函数返回类型
参数规范列表:
必需参数规范列表
必需参数规范列表 ,
可选参数规范列表
可选参数规范列表
必需-parameter-specification-list:
required-parameter-specification
required-parameter-specification ,
required-parameter-specification-list
required-parameter-specification:
parameter-specification
optional-parameter-specification-list:
optional-parameter-specification
optional-parameter-规格 ,
可选参数规范列表
可选参数规范:
optional
参数规范
参数规范:
参数名称参数类型
函数返回类型:
断言
断言:
as
可空原语类型
对函数类型求值的结果是一个基类型为 的类型值function
。
以下示例说明了声明函数类型的语法:
复制
代码语言:javascript复制type function (x as text) as number
type function (y as number, optional z as text) as any
如果函数值的返回类型与函数类型的返回类型兼容,并且该函数类型的每个参数规范都与该函数位置对应的形参兼容,则该函数值符合该函数类型。如果指定的参数类型类型与形式参数的类型兼容,则参数规范与形式参数兼容,如果形式参数是可选的,则参数规范是可选的。
为了确定函数类型的一致性,将忽略形式参数名称。
表类型
甲表类型值被用于定义一个表值的结构。
表类型:
table
行类型
行类型:
[
字段规范列表 ]
评估表类型的结果是一个类型值,其基类型为table
。
表的行类型将表的列名和列类型指定为封闭记录类型。使所有表值符合 type table
,其行类型为 type record
(空打开记录类型)。因此,类型 table 是抽象的,因为没有表值可以具有 typetable
的行类型(但所有表值都具有与 typetable
的行类型兼容的行类型)。以下示例显示了表类型的构造:
复制
代码语言:javascript复制type table [A = text, B = number, C = binary]
// a table type with three columns named A, B, and C
// of column types text, number, and binary, respectively
表类型值还携带表值键的定义。键是一组列名。最多可以指定一个键作为表的主键。(在 M 中,表键没有语义含义。但是,外部数据源(例如数据库或 OData 源)通常会在表上定义键。Power Query 使用键信息来提高高级功能的性能,例如跨源连接操作。)
标准库函数Type.TableKeys
、Type.AddTableKey
、 Type.ReplaceTableKeys
可分别用于获取表类型的键、为表类型添加键和替换表类型的所有键。
复制
代码语言:javascript复制Type.AddTableKey(tableType, {"A", "B"}, false)
// add a non-primary key that combines values from columns A and B
Type.ReplaceTableKeys(tableType, {})
// returns type value with all keys removed
可空类型
对于 any ,可以使用nullable-type派生可空变体:type
T
可空类型:
nullable
类型
结果是一个抽象类型,它允许类型为T或 value 的值null
。
复制
代码语言:javascript复制42 is nullable number // true null is
nullable number // true
的归属type nullable
Ť减小到的归属type null
或type
Ť。(回想一下,可为空的类型是抽象的,没有值可以直接属于抽象类型。)
复制
代码语言:javascript复制Value.Type(42 as nullable number) // type number
Value.Type(null as nullable number) // type null
标准库函数Type.IsNullable
和Type.NonNullable
可用于测试类型的可空性和从类型中删除可空性。
以下保持(对于任何):type
T
type T
兼容type nullable T
Type.NonNullable(type T)
兼容type T
以下是成对等价的(对于 any ):type
T
type nullable any
any
Type.NonNullable(type any)
type anynonnull
type nullable none
type null
Type.NonNullable(type null)
type none
type nullable nullable
T
type nullable
T
Type.NonNullable(Type.NonNullable(type
T))
Type.NonNullable(type
T)
Type.NonNullable(type nullable
T)
Type.NonNullable(type
T)
type nullable (Type.NonNullable(type
T))
type nullable
T
值的归属类型
值的归属类型是声明值要符合的类型。当一个值被赋予一个类型时,只会发生有限的一致性检查。M 不执行超出可空基本类型的一致性检查。选择使用比可空原始类型更复杂的类型定义来赋予值的 M 程序作者必须确保这些值符合这些类型。
可以使用库函数将值归于类型Value.ReplaceType
。如果新类型与值的本机原始类型不兼容,则该函数要么返回具有指定类型的新值,要么引发错误。特别是,当尝试归因于抽象类型(例如 )时,该函数会引发错误any
。
库函数可以选择计算复杂类型并将复杂类型归因于基于输入值的归属类型的结果。
可以使用库函数获取值的归属类型Value.Type
。例如:
复制
代码语言:javascript复制Value.Type( Value.ReplaceType( {1}, type {number} )
// type {number}
类型等效性和兼容性
M 中没有定义类型等价性。任何两个进行相等性比较的类型值可能返回也可能不返回true
。但是,这两种类型(无论true
或false
)之间的关系将始终相同。
可以使用库函数来确定给定类型和可空基本类型之间的兼容性Type.Is
,该函数接受任意类型值作为其第一个参数,将可空基本类型值作为其第二个参数:
复制
代码语言:javascript复制Type.Is(type text, type nullable text) // true
Type.Is(type nullable text, type text) // false
Type.Is(type number, type text) // false
Type.Is(type [a=any], type record) // true
Type.Is(type [a=any], type list) // false
M 不支持确定给定类型与自定义类型的兼容性。
标准库确实包含一组用于从自定义类型中提取定义特征的函数,因此可以将特定的兼容性测试实现为 M 表达式。下面是一些例子;有关完整详细信息,请参阅 M 库规范。
复制
代码语言:javascript复制Type.ListItem( type {number} )
// type number
Type.NonNullable( type nullable text )
// type text
Type.RecordFields( type [A=text, B=time] )
// [ A = [Type = type text, Optional = false],
// B = [Type = type time, Optional = false] ]
Type.TableRow( type table [X=number, Y=date] )
// type [X = number, Y = date]
Type.FunctionParameters(
type function (x as number, optional y as text) as number)
// [ x = type number, y = type nullable text ]
Type.FunctionRequiredParameters(
type function (x as number, optional y as text) as number)
// 1
Type.FunctionReturn(
type function (x as number, optional y as text) as number)
// type number