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 的第二个参数。 在画布应用程序中,Type 函数可与 App.Formulas 中的命名公式一起使用。

语法

RecordOf( TableType )

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

Type( TypeSpecification )

  • 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 ) );