共用方式為


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 – 必要。 類型規範。

範例

類型函數

考慮 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 ) );