ТипыTypes

Значение типа — это значение, которое классифицирует другие значения.A type value is a value that classifies other values. Значение, классифицированное типом, соответствует ему.A value that is classified by a type is said to conform to that type. Система типов M состоит из следующих видов типов.The M type system consists of the following kinds of types:

  • Примитивные типы, которые классифицируют примитивные значения (binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type), а также включают несколько абстрактных типов (function, table, anyи none).Primitive types, which classify primitive values (binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type) and also include a number of abstract types (function, table, any, and none)

  • Типы записей, которые классифицируют значения записей на основе имен полей и типов значений.Record types, which classify record values based on field names and value types

  • Типы списков, которые классифицируют списки, используя базовый тип отдельного элемента.List types, which classify lists using a single item base type

  • Типы функций, которые классифицируют значения функций на основе типов их параметров и возвращаемых значений.Function types, which classify function values based on the types of their parameters and return values

  • Типы таблиц, которые классифицируют табличные значения на основе имен столбцов, типов столбцов и ключей.Table types, which classify table values based on column names, column types, and keys

  • Типы, допускающие значение NULL, которые классифицируют значение NULL в дополнение ко всем значениям, классифицируемым базовым типом.Nullable types, which classifies the value null in addition to all the values classified by a base type

  • Типы типов, которые классифицируют значения, являющиеся типами.Type types, which classify values that are types

Набор примитивных типов включает типы примитивных значений, несколько абстрактных типов, типы, которые не могут однозначно классифицировать какие-либо значения: function, table, any и none.The set of primitive types includes the types of primitive values a number of abstract types, types that do not uniquely classify any values: function, table, any, and none. Все значения функций соответствуют абстрактному типу function, все табличные значения — абстрактному типу table, все значения — абстрактному типу any и никакие значения — абстрактному типу none.All function values conform to the abstract type function, all table values to the abstract type table, all values to the abstract type any, and no values to the abstract type none. Выражение типа none должно вызвать ошибку или завершиться сбоем, так как невозможно создать значение, соответствующее типу none.An expression of type none must raise an error or fail to terminate since no value could be produced that conforms to type none. Обратите внимание, что примитивные типы function и table являются абстрактными, так как ни одна функция или таблица, соответственно, не относятся непосредственно к этим типам.Note that the primitive types function and table are abstract because no function or table is directly of those types, respectively. Примитивные типы record и list не являются абстрактными, так как они представляют открытую запись без определенных полей и список типа "any" соответственно.The primitive types record and list are non-abstract because they represent an open record with no defined fields and a list of type any, respectively.

Все типы, не являющиеся членами закрытого набора примитивных типов, в совокупности называются пользовательскими типами.All types that are not members of the closed set of primitive types are collectively referred to as custom types. Пользовательские типы можно написать с помощью type-expression:Custom types can be written using a type-expression:

выражение-типа:
      основное-выражение
type-expression:
      primary-expression

      type основной-тип
тип:
      выражение-в-круглых-скобках
      основной-тип
основной-тип:
      тип-примитива
      тип-записи
      тип-списка
      тип-функции
      тип-таблицы
      тип-допускающий-значение-NULL
тип-примитива:
один из следующего
      type primary-type
type:
      parenthesized-expression
      primary-type
primary-type:
      primitive-type
      record-type
      list-type
      function-type
      table-type
      nullable-type
primitive-type:
one of

      any binary date datetime datetimezone duration function list logical      any binary date datetime datetimezone duration function list logical
      none null number record table text time type      none null number record table text time type

Имена примитивных-типов являются контекстными ключевыми словами, распознаваемыми только в контексте типа.The primitive-type names are contextual keywords recognized only in a type context. Использование круглых скобок в контексте типа переводит грамматику обратно в контекст регулярного выражения, что требует использования ключевого слова "type" для перемещения обратно в контекст типа.The use of parentheses in a type context moves the grammar back to a regular expression context, requiring the use of the type keyword to move back into a type context. Например, чтобы вызвать функцию в контексте типа, можно использовать круглые скобки:For example, to invoke a function in a type context, parentheses can be used:

type nullable ( Type.ForList({type number}) )   
// type nullable {number}

Круглые скобки также можно использовать для доступа к переменной, имя которой конфликтует с именем примитивного типа:Parentheses can also be used to access a variable whose name collides with a primitive-type name:

let  record = type [ A = any ]  in  type {(record)} 
// type {[ A = any ]}

В следующем примере определяется тип, классифицирующий список чисел:The following example defines a type that classifies a list of numbers:

type { number }

Аналогичным образом в следующем примере определяется пользовательский тип, классифицирующий записи с обязательными полями X и Y, значения которых являются числами:Similarly, the following example defines a custom type that classifies records with mandatory fields named X and Y whose values are numbers:

type [ X = number, Y = number ]

Приписываемый тип значения получается с помощью функции стандартной библиотеки Value.Type, как показано в следующих примерах:The ascribed type of a value is obtained using the standard library function Value.Type, as shown in the following examples:

Value.Type( 2 )                 // type number 
Value.Type( {2} )               // type list 
Value.Type( [ X = 1, Y = 2 ] )  // type record

Оператор is используется для определения того, совместим ли тип значения с заданным типом, как показано в следующих примерах:The is operator is used to determine whether a value's type is compatible with a given type, as shown in the following examples:

1 is number          // true 
1 is text            // false 
{2} is list          // true

Оператор as проверяет, совместимо ли значение с заданным типом, и вызывает ошибку, если это не так.The as operator checks if the value is compatible with the given type, and raises an error if it is not. В противном случае он возвращает исходное значение.Otherwise, it returns the original value.

Value.Type( 1 as number )   // type number 
{2} as text                 // error, type mismatch

Обратите внимание, что операторы is и as принимают в качестве правого операнда только примитивные типы.Note that the is and as operators only accept primitive types as their right operand. Язык M не предоставляет средства для проверки значений на соответствие пользовательским типам.M does not provide means to check values for conformance to custom types.

Тип X совместим с типом Y только в том случае, если все значения, соответствующие X, также соответствуют Y.A type X is compatible with a type Y if and only if all values that conform to X also conform to Y. Все типы совместимы с типом any, и никакие типы (кроме самого none) не совместимы с типом none.All types are compatible with type any and no types (but none itself) are compatible with type none. На следующем графе показана связь совместимости.The following graph shows the compatibility relation. (Совместимость типов является рефлексивной и транзитивной.(Type compatibility is reflexive and transitive. Она формирует решетку с типом any в качестве верхнего значения и типом none в качестве нижнего значения.) Имена абстрактных типов выделены курсивом.It forms a lattice with type any as the top and type none as the bottom value.) The names of abstract types are set in italics.

Совместимость типов

Для значений типов определены следующие операторы.The following operators are defined for type values:

ОператорOperator РезультатResult
x = y РавноEqual
x <> y Не равноNot equal

Собственный тип значений типа — это встроенный тип type.The native type of type values is the intrinsic type type.

Примитивные типыPrimitive Types

Типы в языке M формируют несвязанную иерархию, корнем которой является тип any, классифицирующий все значения.Types in the M language form a disjoint hierarchy rooted at type any, which is the type that classifies all values. Любое значение M соответствует только одному примитивному подтипу any.Any M value conforms to exactly one primitive subtype of any. Закрытый набор примитивных типов, производных от типа any, выглядит следующим образом.The closed set of primitive types deriving from type any are as follows:

  • type null, который классифицирует значение NULL.type null, which classifies the null value.
  • type logical, который классифицирует значения true и false.type logical, which classifies the values true and false.
  • type number, который классифицирует числовые значения.type number, which classifies number values.
  • type time, который классифицирует значения времени.type time, which classifies time values.
  • type date, который классифицирует значения даты.type date, which classifies date values.
  • type datetime, который классифицирует значения datetime.type datetime, which classifies datetime values.
  • type datetimezone, который классифицирует значения datetimezone.type datetimezone, which classifies datetimezone values.
  • type duration, который классифицирует значения длительности.type duration, which classifies duration values.
  • type text, который классифицирует текстовые значения.type text, which classifies text values.
  • type binary, который классифицирует двоичные значения.type binary, which classifies binary values.
  • type type, который классифицирует значения типов.type type, which classifies type values.
  • type list, который классифицирует значения списков.type list, which classifies list values.
  • type record, который классифицирует значения записей.type record, which classifies record values.
  • type table, который классифицирует табличные значения.type table, which classifies table values.
  • type function, который классифицирует значения функций.type function, which classifies function values.
  • type anynonnull, который классифицирует все значения, кроме NULL.type anynonnull, which classifies all values excluding null. Внутренний тип none не классифицирует никакие значения.The intrinsic type none classifies no values.

Тип anyAny Type

Тип any является абстрактным, классифицирует все значения в M, и все типы в M совместимы с any.The type any is abstract, classifies all values in M, and all types in M are compatible with any. Переменные типа any могут быть привязаны ко всем возможным значениям.Variables of type any can be bound to all possible values. Так как any является абстрактным, он не может быть приписан значениям, — т. е. никакие значение не может напрямую иметь тип any.Since any is abstract, it cannot be ascribed to values—that is, no value is directly of type any.

Типы списковList Types

Любое значение, которое является списком, соответствует встроенному типу list, который не налагает никаких ограничений на элементы в значении списка.Any value that is a list conforms to the intrinsic type list, which does not place any restrictions on the items within a list value.

тип-списка:list-type:
      { тип-элемента }      { item-type }
тип-элемента:
      тип
item-type:
      type

Результатом вычисления типа-списка является значение типа списка с базовым типом list.The result of evaluating a list-type is a list type value whose base type is list.

В следующих примерах показан синтаксис объявления однородных типов списков:The following examples illustrate the syntax for declaring homogeneous list types:

type { number }        // list of numbers type 
     { record }        // list of records type
     {{ text }}        // list of lists of text values

Значение соответствует типу списка, если оно является списком, а каждый элемент в этом значении списка соответствует типу элемента типа списка.A value conforms to a list type if the value is a list and each item in that list value conforms to the list type's item type.

Тип элемента типа списка указывает привязку: все элементы соответствующего списка соответствуют типу элемента.The item type of a list type indicates a bound: all items of a conforming list conform to the item type.

Типы записейRecord Types

Любое значение, которое является записью, соответствует встроенному типу "record", который не налагает никаких ограничений на имена полей или значения в значении записи.Any value that is a record conforms to the intrinsic type record, which does not place any restrictions on the field names or values within a record value. Значение типа-записи используется для ограничения набора допустимых имен, а также типов значений, которые могут быть связаны с этими именами.A record-type value is used to restrict the set of valid names as well as the types of values that are permitted to be associated with those names.

тип-записи:record-type:
      [ маркер-открытой-записи ]      [ open-record-marker ]
      [ список-спецификаций-полянеобязательно ]      [ field-specification-listopt ]
      [ список-спецификаций-поля, маркер-открытой-записи ]      [ field-specification-list , open-record-marker ]
список-спецификаций-поля:
      спецификация-поля
      спецификация-поля , список-спецификаций-поля
спецификация-поля:
field-specification-list:
      field-specification
      field-specification , field-specification-list
field-specification:

      optionalнеобязательно имя-поля спецификация-типа-полянеобязательно
спецификация-типа-поля:
      optionalopt field-name field-type-specificationopt
field-type-specification:

      = тип-поля
тип-поля:
      тип
маркер-открытой-записи:
      = field-type
field-type:
      type
open-record-marker:

      ...      ...

Результатом вычисления типа-записи является значение типа с базовым типом record.The result of evaluating a record-type is a type value whose base type is record.

В следующих примерах показан синтаксис объявления типов записей:The following examples illustrate the syntax for declaring record types:

type [ X = number, Y = number] 
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ] 
type [ Name = text, ... ]

Типы записей закрыты по умолчанию, что означает, что дополнительные поля, отсутствующие в списке-спецификаций-поля, не могут присутствовать в соответствующих значениях.Record types are closed by default, meaning that additional fields not present in the fieldspecification-list are not allowed to be present in conforming values. Включение маркера-открытой-записи в тип записи объявляет тип как открытый, что разрешает поля, отсутствующие в списке спецификаций поля.Including the openrecord-marker in the record type declares the type to be open, which permits fields not present in the field specification list. Следующие два выражения эквивалентны:The following two expressions are equivalent:

type record   // primitive type classifying all records 
type [ ... ]  // custom type classifying all records

Значение соответствует типу записи, если оно является записью и все спецификации полей в типе записи удовлетворены.A value conforms to a record type if the value is a record and each field specification in the record type is satisfied. Спецификация поля считается удовлетворенной, если выполняется одно из следующих условий.A field specification is satisfied if any of the following are true:

  • В записи существует имя поля, совпадающее с идентификатором спецификации, а связанное значение соответствует типу спецификации.A field name matching the specification's identifier exists in the record and the associated value conforms to the specification's type

  • Спецификация помечена как необязательная, и в записи не найдено соответствующее имя поля.The specification is marked as optional and no corresponding field name is found in the record

Соответствующее значение может содержать имена полей, не указанные в списке спецификаций поля, и только в том случае, если тип записи является открытым.A conforming value may contain field names not listed in the field specification list if and only if the record type is open.

Типы функцийFunction Types

Любое значение функции соответствует примитивному типу function, который не налагает никаких ограничений на типы формальных параметров функции или возвращаемое значение функции.Any function value conforms to the primitive type function, which does not place any restrictions on the types of the function's formal parameters or the function's return value. Пользовательское значение типа функции используется для наложения ограничений на типы в сигнатурах соответствующих значений функций.A custom function-type value is used to place type restrictions on the signatures of conformant function values.

тип-функций:function-type:
      function ( список-спецификаций-параметранеобязательно ) тип-возвращаемого-значения-функции
список-спецификаций-параметра:
      список-спецификаций-обязательного-параметра
      список-спецификаций-обязательного-параметра
, список-спецификаций-необязательного-параметра
      список-спецификаций-необязательного-параметра
список-спецификаций-обязательного-параметра:
      список-спецификаций-обязательного-параметра
      список-спецификаций-обязательного-параметра
, список-спецификаций-обязательного-параметра
список-спецификаций-обязательного-параметра:
      спецификация-параметра
список-спецификаций-необязательного-параметра:
      спецификация-необязательного-параметра
      спецификация-необязательного-параметра
, список-спецификаций-необязательного-параметра
спецификация-необязательного-параметра:
      function ( parameter-specification-listopt ) function-return-type
parameter-specification-list:
      required-parameter-specification-list
      required-parameter-specification-list
, optional-parameter-specification-list
      optional-parameter-specification-list
required-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-specification
, optional-parameter-specification-list
optional-parameter-specification:

      optional спецификация-параметра
спецификация-параметра:
      имя-параметра тип-параметра
тип-возвращаемого-значения-функции:
      утверждение
утверждение:
      optional parameter-specification
parameter-specification:
      parameter-name parameter-type
function-return-type:
      assertion
assertion:

      as тип-примитива-допускающий-значение-NULL      as nullable-primitive-type

Результатом вычисления типа-функции является значение типа с базовым типом function.The result of evaluating a function-type is a type value whose base type is function.

В следующих примерах показан синтаксис объявления типов функций:The following examples illustrate the syntax for declaring function types:

type function (x as text) as number 
type function (y as number, optional z as text) as any

Значение функции соответствует типу функции, если тип возвращаемого значения для значения функции совместим с типом возвращаемого значения для типа функции, а каждая спецификация параметра типа функции совместима с формальным параметром функции, стоящим на аналогичной позиции.A function value conforms to a function type if the return type of the function value is compatible with the function type's return type and each parameter specification of the function type is compatible to the positionally corresponding formal parameter of the function. Спецификация параметра совместима с формальным параметром, если указанный тип-параметра совместим с типом формального параметра, а спецификация параметра является необязательной, если формальный параметр является необязательным.A parameter specification is compatible with a formal parameter if the specified parameter-type type is compatible with the type of the formal parameter and the parameter specification is optional if the formal parameter is optional.

Имена формальных параметров игнорируются в целях определения соответствия типов функций.Formal parameter names are ignored for the purposes of determining function type conformance.

Типы таблицTable types

Значение-типа-таблицы используется для определения структуры табличного значения.A table-type value is used to define the structure of a table value.

тип-таблицы:table-type:
      table тип-строки
тип-строки:
      table row-type
row-type:

      [ список-спецификаций-поля ]      [ field-specification-list ]

Результатом вычисления типа-таблицы является значение типа с базовым типом table.The result of evaluating a table-type is a type value whose base type is table.

Тип строки таблицы указывает имена столбцов и типы столбцов таблицы в виде закрытого типа записи.The row type of a table specifies the column names and column types of the table as a closed record type. Чтобы все табличные значения соответствовали типу table, тип строки имеет тип record (пустой открытый тип записи).So that all table values conform to the type table, its row type is type record (the empty open record type). Таким образом, тип таблицы является абстрактным, так как никакое табличное значение не может иметь тип строк типа table (но все табличные значения имеют тип строки, совместимый с типом строки типа table).Thus, type table is abstract since no table value can have type table's row type (but all table values have a row type that is compatible with type table's row type). В следующем примере показана конструкция типа таблицы:The following example shows the construction of a table type:

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

Значение типа таблицы также содержит определение ключей табличного значения.A table-type value also carries the definition of a table value's keys. Ключ — это набор имен столбцов.A key is a set of column names. В качестве первичного ключа можно назначить не более одного ключа.At most one key can be designated as the table's primary key. (В языке M ключи таблиц не имеют семантического значения.(Within M, table keys have no semantic meaning. Однако обычно для внешних источников данных, таких как базы данных или веб-каналы OData, определяются ключи в таблицах.However, it is common for external data sources, such as databases or OData feeds, to define keys over tables. Power Query использует сведения о ключе для повышения производительности расширенных функций, таких как операции объединения между источниками.)Power Query uses key information to improve performance of advanced functionality, such as cross-source join operations.)

Функции стандартной библиотеки Type.TableKeys, Type.AddTableKey и Type.ReplaceTableKeys можно использовать для получения ключей типа таблицы, добавления ключа в тип таблицы и замены всех ключей типа таблицы соответственно.The standard library functions Type.TableKeys, Type.AddTableKey, and Type.ReplaceTableKeys can be used to obtain the keys of a table type, add a key to a table type, and replace all keys of a table type, respectively.

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

Типы, допускающие значение NULLNullable types

Для любого type T можно получить вариант, допускающий значение NULL, с помощью типа-допускающего-значение-NULL:For any type T, a nullable variant can be derived by using nullable-type:

тип-допускающий-значение-NULL:nullable-type:
      nullable тип      nullable type

Результатом является абстрактный тип, допускающий значения типа T или значение null.The result is an abstract type that allows values of type T or the value null.

42 is nullable number             // true null is
nullable number                   // true

Приписка type nullable T сокращается до приписки type null или type T. (Помните, что типы, допускающие значение NULL, являются абстрактными и никакое значение не может относиться непосредственно к абстрактному типу.)Ascription of type nullable T reduces to ascription of type null or type T. (Recall that nullable types are abstract and no value can be directly of abstract type.)

Value.Type(42 as nullable number)       // type number
Value.Type(null as nullable number)     // type null

Функции стандартной библиотеки Type.IsNullable и Type.NonNullable можно использовать для проверки типа на допустимость значений NULL и для удаления допустимости значений NULL из типа.The standard library functions Type.IsNullable and Type.NonNullable can be used to test a type for nullability and to remove nullability from a type.

Происходит следующее (для любого type T):The following hold (for any type T):

  • type T совместим с type nullable Ttype T is compatible with type nullable T
  • Type.NonNullable(type T) совместим с type TType.NonNullable(type T) is compatible with type T

Ниже приведены попарные эквиваленты (для любого type T):The following are pairwise equivalent (for any type T):

    type nullable any
    any    any

    Type.NonNullable(type any)
    type anynonnull    type anynonnull

    type nullable none
    type null    type null

    Type.NonNullable(type null)
    type none    type none

    type nullable nullable T    type nullable nullable T
    type nullable T    type nullable T

    Type.NonNullable(Type.NonNullable(type T))    Type.NonNullable(Type.NonNullable(type T))
    Type.NonNullable(type T)    Type.NonNullable(type T)

    Type.NonNullable(type nullable T)    Type.NonNullable(type nullable T)
    Type.NonNullable(type T)    Type.NonNullable(type T)

    type nullable (Type.NonNullable(type T))    type nullable (Type.NonNullable(type T))
    type nullable T    type nullable T

Приписываемый тип значенияAscribed type of a value

Приписываемый тип значения — это тип, которому, согласно объявлению, соответствует значение.A value's ascribed type is the type to which a value is declared to conform. Если значение приписывается типу, то выполняется только ограниченная проверка соответствия.When a value is ascribed a type, only a limited conformance check occurs. Язык M не выполняет проверку соответствия за пределами примитивного типа, допускающего значение NULL. Авторы программы на языке M, решающие приписать определениям типов значения, более сложные, чем примитивный тип, допускающий значение NULL, должны обеспечить соответствие таких значений этим типам.M does not perform conformance checking beyond a nullable primitive type. M program authors that choose to ascribe values with type definitions more complex than a nullable primitive-type must ensure that such values conform to these types.

Значение можно приписать типу с помощью функции библиотеки Value.ReplaceType.A value may be ascribed a type using the library function Value.ReplaceType. Эта функция возвращает либо новое значение приписываемого типа, либо ошибку, если новый тип несовместим с собственным примитивным типом значения.The function either returns a new value with the type ascribed or raises an error if the new type is incompatible with the value's native primitive type. В частности, эта функция возвращает ошибку при попытке приписать абстрактный тип, такой как any.In particular, the function raises an error when an attempt is made to ascribe an abstract type, such as any.

Функции библиотеки могут вычислять и приписывать сложные типы результатам на основе приписываемых типов входных значений.Library functions may choose to compute and ascribe complex types to results based on the ascribed types of the input values.

Приписываемый тип значения можно получить с помощью функции библиотеки Value.Type.The ascribed type of a value may be obtained using the library function Value.Type. Например:For example:

Value.Type( Value.ReplaceType( {1}, type {number} ) 
// type {number}

Эквивалентность типов и совместимостьType equivalence and compatibility

Эквивалентность типов в языке M не определена. Значения двух любых типов, сравниваемые на предмет равенства, могут возвращать или не возвращать true.Type equivalence is not defined in M. Any two type values that are compared for equality may or may not return true. Однако связь между этими двумя типами (независимо от того, получено ли значение true или false) всегда будет одинаковой.However, the relation between those two types (whether true or false) will always be the same.

Совместимость между заданным типом и примитивным типом, допускающим значение NULL, можно определить с помощью функции библиотеки Type.Is, которая принимает произвольное значение типа в качестве первого аргумента и значение примитивного типа, допускающего значение NULL, в качестве второго аргумента:Compatibility between a given type and a nullable primitive type can be determined using the library function Type.Is, which accepts an arbitrary type value as its first and a nullable primitive type value as its second argument:

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 отсутствует поддержка для определения совместимости заданного типа с пользовательским типом.There is no support in M for determining compatibility of a given type with a custom type.

Стандартная библиотека включает коллекцию функций для извлечения определяющих характеристик из пользовательского типа, поэтому определенные тесты совместимости можно реализовать как выражения M.The standard library does include a collection of functions to extract the defining characteristics from a custom type, so specific compatibility tests can be implemented as M expressions. Ниже приведены некоторые примеры, полные сведения см. в спецификации библиотеки M.Below are some examples; consult the M library specification for full details.

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