RecordOf 和 Type 函数

适用于:画布应用

构造用于用户定义函数和非类型化值的用户定义类型。

重要提示

Description

Power Fx 中的每个函数都定义了可作为参数传递的值的类型以及输出的类型。 编写公式时会检查类型,如果错误与预期不一致,则会显示错误。 编辑器还使用类型来建议要传递到函数中的内容的好选项,并尽早检测错误。

创建自己的用户定义函数时,需要指定输入和输出类型。 对于 DecimalText 等简单类型,这很容易,因为这些基本类型都是预定义的。 对于更复杂的类型(如记录或表),请使用 Type 函数创建类型。

Type 函数还使动态值更易于使用。 使用 ParseJSONIsTypeAsType 函数,动态值可以转换为类型化对象,在该对象中不再需要在使用点单独键入列。

Type 函数采用 TypeSpecification 作为其唯一参数。 最简单的类型说明是引用现有类型,例如 Type( Text )。 记录或表的类型规范类似于使用文本值定义记录或表,其中值将替换为类型名称。 例如,{Name: "Jane"} 可以用 Type( {Name: Text} ) 类型化。 表格是用方括号指定的,而不是 Table 函数,而且只能提供一条记录。 例如,[1,2,3] 可以用 Type( [Number] ) 类型化。

使用 RecordOf 函数从表类型中提取记录类型。 例如,Type( RecordOf( Library ) ) 将返回图书馆中一本图书的类型。 若要根据记录类型创建表类型,请将记录类型括在方括号中。 例如,Type( [ Book ] ) 定义了一个图书馆。 RecordOf 只能在函数中使用 Type

函数 Type 及其返回的类型值只能在 Power Fx 的特定位置使用,例如 ParseJSON 的第二个参数。 在 Canvas 应用中,该 Type 函数可与 App.Formulas 中的命名公式一起使用。

语法

RecordOfTableType

  • TableType - 必填。 表格的类型名称。 这不接受类型规范,它需要是以前为表定义的类型的名称。

TypeTypeSpecification

  • TypeSpecification - 必填。 类型规范。

示例

Type 函数

请看 App.Formulas 中的以下定义:

Library = 
  [ { Title: "A Study in Scarlet", Author: "Sir Arthur Conan Doyle", Published: 1887 }, 
    { Title: "And Then There Were None", Author: "Agatha Christie", Published: 1939 },
    { Title: "The Marvelous Land of Oz", Author: "L. Frank Baum", Published: 1904 } ];

// Type definition for a single book
BookType := Type( { Title: Text, Author: Text, Published: Number } );

// Type definition for a table of books
LibraryType := Type( [ BookType ] );

请注意实际标题文本 "A Study in Scarlet" 是如何被类型规范中的类型名称 Text 代替的,后者是任何文本值的占位符。 类型为 BookType 的参数或变量可以保存 Library 中的一本书,而 LibraryType 则可以保存整个表格。 有了这些类型,我们可以定义这些用户定义的函数:

SortedBooks( books: LibraryType ): LibraryType = 
    SortByColumns( Library, Author, SortOrder.Ascending, Title, SortOrder.Ascending );

PublishedInLeapYear( book: BookType ): Boolean = 
    Mod( book.Published, 4 ) = 0 And 
    (Mod( book.Published, 100 ) <> 0 Or Mod( book.Published, 400 ) = 0);

您也可以使用 BookType 来解析包含一本书的 JSON 字符串:

ParseJSON( "{""Title"":""Gulliver's Travels"", ""Author"": ""Jonathan Swift"", ""Published"": 1900}", BookType
)

使用 BookType 作为 ParseJSON 的第二个参数,会得到一个类型化的记录,可以像其他 Power Fx 记录一样使用。

RecordOf 函数

Type 函数示例中,首先 BookType 对其进行包装并生成 LibraryType 表。 我们可以反过来定义这些类型:

// Type definition for a table of books
RecordOfLibraryType := Type( [ { Title: Text, Author: Text, Published: Number } ] );

// Type definition for a single book
RecordOfBookType := Type( RecordOf( RecordOfLibraryType ) );