2017-09-30 6 views
1

libraryを書いています。これをtypescriptに移植したいと思います。プロパティを持つ関数を宣言するTypescript

const is = value => { 
    ... do some returns here 
} 

is.number = x => typeof x === 'number' 
is.bla = x => typeof x === 'bla' 

index.jsなど:

は現在、それはそのようなものを見て。

isとそのすべてのメソッドについて記述しているインターフェイスを作成しました。私はタイプとisをマークしようとすると

type TypeQueryMethod = (val: any) => boolean; 

interface Is { 
    (val: any): string; 
    undefined: TypeQueryMethod; 
    null: TypeQueryMethod; 
    ... 
} 

const is: Is = value => ...

これは、エラーがスローされます:オブジェクトの宣言が分割されているので

Type '(value: any) => string' is not assignable to type 'Is'. 
Property 'undefined' is missing in type '(value: any) => string'. 

理にかなって。

メソッドとメソッドの両方を持つこのようなオブジェクトを作成するにはどうすればよいですか?

答えて

1

機能とそのプロパティを同時に実装することはできません。あなた最初の関数を定義し、Isにそれを主張し、メソッドの残りの部分を定義することができます。

const is = ((val: any) => typeof (val)) as any as Is; 

is.null = (val) => true; 
is.undefined = (val) => true; 

またはIsを作成するファクトリ関数を使用します。

function createIs(): Is { 
    const is = ((val: any) => { 
     return ""; 
    }) as Is; 
    is.null = (val) => true; 
    is.undefined= (val) => true; 
    return is; 
} 

const is: Is = createIs(); 
+0

'Object.assign()'を使って型アサーションなしで 'Is'を作成できるはずです。 – jcalz

0

あなたは型チェッカーを作りたい場合幸せな、あなたは段階的にそれを構築することなく、完全に形成されIsオブジェクトを返すためにObject.assign()を使用することができます。

const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    undefined: (val: any) => typeof val === 'undefined', 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

もちろん、コードの構造を変更したくない場合は、@ Saravanaが提案するようにtype assertionを使用して、isが確かにIsであることを型チェッカーに通知することができます1つはあなたがそれを構築し終わるまで。

いずれの方法でも動作しますが、あなたが何かを実装するのを怠ると型チェッカーは警告を表示しますので、私はObject.assign()方法を好む:型アサーション方法はありませんが

// error, "undefined" is missing 
const is: Is = Object.assign(
    (val: any) => typeof val, 
    { 
    null: (val: any) => (val === null) 
    // ... 
    } 
); 

を:

const is = ((val: any) => typeof val) as any as Is; 
is.null = (val) => val === null; 
// no error 

型アサーションメソッドはそうではありません。それはあなた次第です。希望は助けます。がんばろう!

関連する問題