RecordOf 和 Type 函数
适用于:画布应用
构造用于用户定义函数和非类型化值的用户定义类型。
重要提示
- 这些函数是实验性的。
- 实验性功能并非用于生产,可能并不完整。 这些功能在正式发布之前已经可用,以便您可以及早使用并提供反馈。 详细信息:了解画布应用中的试验、预览和停用功能
- 只有打开设置 > 即将推出的功能 > 实验中的用户定义的类型实验功能(默认为关闭),才能使用此行为。
- 您的反馈非常宝贵。 请在 Power Apps 试验功能社区论坛中告诉我们您的想法。
Description
Power Fx 中的每个函数都定义了可作为参数传递的值的类型以及输出的类型。 编写公式时会检查类型,如果错误与预期不一致,则会显示错误。 编辑器还使用类型来建议要传递到函数中的内容的好选项,并尽早检测错误。
创建自己的用户定义函数时,需要指定输入和输出类型。 对于 Decimal 或 Text 等简单类型,这很容易,因为这些基本类型都是预定义的。 对于记录或表格等更复杂的类型,请使用 Type 函数创建类型。
Type 函数还能让非类型化对象更容易处理。 使用 ParseJSON、IsType 和 AsType 函数,可以将非类型化对象转换为类型化对象,在使用时不再需要单独类型化列。
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 ) );