2016-11-11 9 views
1

私は型を宣言するには2つの方法を見つけた:myVar as typeまたはtype textパワークエリのタイプ定義

それぞれ異なるコンテキストに適用されているようです。例えば:私はテキストのみの値または数字のみのリストになり{text}または{number}のようなより複雑な型、のために期待するよう

Table.AddColumn(myTable, "NewName", each [aColumn], type text) 

または

MyFunc = (aParam as any) as date => Date.From(aParam) 

しかし、これは動作しません。 。 typeの構文でこれらのタイプを使用できますが、as typeの構文は使用できません。

なぜですか?

また、Mの宣言型はパフォーマンスに影響を及ぼしますか、誤った型が渡された/返された場合にエラーを発生させるだけですか?

答えて

2

"M"で宣言するタイプは、パフォーマンスにはほとんど影響を与えません。また、関数をより "自己文書化"にします。

関数が呼び出されると、関数の引数型 "kind"がチェックされ、カスタムの完全型定義はチェックされません。したがって、リストのテキストを期待する関数に数値のリストを渡してもエラーは発生しません。あなたは、いくつかの「M」でそれを見ることができます。

let 
    FunctionType = type function (l as { text }) as any, 
    UntypedFunction = (l) => l{0}, 
    TypedFunction = Value.ReplaceType(UntypedFunction, FunctionType), 
    Invoked = TypedFunction({0, 1, 2}) 
in 
    Invoked 

は、リストの各要素をチェックするリスト全体をループする必要になるので、再帰的なタイプは、パフォーマンスのために良いですチェックしません。

(l) => l{0}のような関数値を書くときは、as listのようなプリミティブ型しか使用できず、as { text }ではありません。私は、この制限は、関数の作者が関数によって尊重されない型の制限を入れないようにするためのものだと考えています。

Language Specificationで構文が許すものについて詳しく読むことができます。 (そのリンクが消えた場合は、MDSNからPDFリンクをたどることができるはずです)

関連する問題