2017-02-03 75 views
0

我有實用的方法是這樣的:我應該使用字符串作爲TypeScript中返回值的類型嗎?

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

我用確切的返回值作爲返回類型和打字稿編譯得當,沒有失誤。

這是一個很好的做法,使用這種方法,或者我應該把string呢?

爲了確保它不只是忽略了,我想這一個打字稿給我一個錯誤:

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是一種類型清晰的腳本,您應該使用顯式類型作爲返回類型。

打字稿編譯器會創建一個從字符串字面'my-component-class-name'返回類型爲getClassName(),這是一個Type Aliases,等於type returnType = 'my-component-class-name'並設置returnTypegetClassName()的返回類型。然而,return 'wrong-value'是​​s類型,它是string類型,不等於定義的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 -component級名1 '%20%7B%0D 0A%%20%20%20%20%20%20%20%20return%20'my組分類名' %0D 0A%%20%20 %20%20%7D%0D%0A%7D –

+0

我重新編輯帖子。 – serveryang

0

正如另一個答案中所述,編譯器忽略了您的返回類型。未來的編譯器可能不會那麼寬容。如果你真的想聲明一個常量,爲什麼不使用常量而不是函數呢?或者,因爲你想要的類名,get it from the JavaScript runtime.

編輯補充:作爲這個答案的評論指出,myObj.constructor.name可能無法生存縮小或其他類截斷。我曾經在TypeScript中做過類似getClassName的函數,但最終在我想得更難時重構它們。爲什麼我想要那個名字。機會是,你想要調出一些在JavaScript中沒有明確定義的特徵,並且這些特徵無法通過重構將你的類變成一個接口或混合類。因此,請考慮調用方法getXXXType,其中XXX描述了您最感興趣的品質,例如getNumericalOperatorType,getDateFormattingType,getHipaCertificationType等。當您發現您的班級已採取行動時,這也會爲您增添不同類型的呼吸空間more than one responsibility

相關問題