2017-02-03 26 views
0

私はこのようなユーティリティメソッドを持っている:TypeScriptで戻り値の型として文字列リテラルを使用する必要がありますか?

private static getClassName(): 'my-component-class-name' { 
    return 'my-component-class-name' 
} 

私は戻り値の型として、正確な戻り値を使用し、活字体がエラーなしで、それを適切にコンパイルします。

この方法を使用することをお勧めしますか、代わりにstringを入力する必要がありますか?

それは単に無視されていないことを確認するために、私はこの1つを試してみましたが、typescriptですが私にエラーを示した。ここで

private static getClassName(): 'my-component-class-name' { 
    return 'wrong-value' 
} 

は誤りです。このコードの活字体の遊び場に

Type '"wrong-value"' is not assignable to type '"my-component-class-name"'.

Here is the link

+0

私はそれのような何かを見たことはありません。私は文字列に固執しますが、それはあなたの構文を使用することから来るどんな利益も知らないからです。 –

+0

No.
「getClassName」は、ここから取得できます。http://stackoverflow.com/questions/13613524/get-an-objects-class-name-at-runtime-in-typescript – serveryang

+0

@serveryang質問は、コンストラクタのクラス名を取得する方法ではなく、上記のように文字列リテラルを戻り値の型として使うことの正確さです。 –

答えて

0

おすすめしません!

TypeScriptはタイプクリアスクリプトです。戻り値の型として明示的な型を使用する必要があります。

活字体のコンパイラは、それがtype returnType = 'my-component-class-name'に等しいType Aliases、だ、getClassName()ため'my-component-class-name'文字列リテラルからの戻り値の型を作成し、getClassName()の戻り値の型としてreturnTypeを設定します。しかしながら、return 'wrong-value'は、タイプであり、定義されたreturnTypeと等しくない​​タイプである。

コードを成功させるには、'my-component-class-name'の後に| stringを追加します。それは組合型です。

コードスニペット:

type returnType = "my-component-class-name"; 
var value: returnType = "my-component-class-name"; 

type returnType1 = "my-component-class-name" | string; 
var value1: returnType1 = "union type"; 

type returnType2 = true; 
var value2 : returnType2 = true; 

type returnType3 = 1; 
var value3: returnType3 = 1; 

class A { 
    public static getClassName(): returnType { 
    return value; 
    } 

    public static getClassName1(): returnType1 { 
    return value1; 
    } 

    public static getClassName2(): returnType2 { 
    return value2; 
    } 

    public static getClassName3(): returnType3 { 
    return value3; 
    } 
} 

console.log(A.getClassName()); 
console.log(A.getClassName1()); 
console.log(A.getClassName2()); 
console.log(A.getClassName3()); 

出力である:

my-component-class-name 
union type 
true 
1 

タイプ別名DOC:http://www.typescriptlang.org/docs/handbook/advanced-types.html

+0

戻り値の型と異なる文字列を置くと、エラーが表示されるので、無視しませんでした。 こちらをご覧くださいhttps://www.typescriptlang.org/play/#src=class%20A%20%7B%0D%0A%20%20%20%20private%20static%20getClassName()%3A%20'my - コンポーネントクラス名 '%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20'my-component-class-name'%0D%0A%20%20 %20%20%7D%0D%0A%7D –

+0

投稿を編集します。 – serveryang

0

別の回答に記載されているように、コンパイラは戻り値の型を無視しています。将来のコンパイラはあまり許されないかもしれません。本当に定数を宣言したいのであれば、関数ではなく定数を使うのはなぜですか?それとも、クラス名を欲しい以来、

編集get it from the JavaScript runtime.追加する:その答えのコメントが指摘として、myObj.constructor.nameは縮小または他のクラスのマングリングに耐えられない可能性があります。私はgetClassNameのようなものを前にTypeScriptで使っていましたが、もっと難しく思ったときにそれらをリファクタリングすることになりましたなぜその名前が欲しいですか? JavaScriptでうまく定義されていない、インターフェースやmixinにあなたのクラスを変えるリファクタリングを生き残れない、いくつかの特性を呼び出す可能性があります。したがって、getXXXTypeというメソッドを呼び出すことをお勧めします。ここでは、getNumericalOperatorTypegetDateFormattingTypegetHipaCertificationTypeなど、最も関心のある性質が記述されています。これにより、クラスが実行されたことを検出したときに、 more than one responsibility

関連する問題