2016-12-06 37 views
0

給出一個字符串類型:重新申報字符串字面類型

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 

我可以添加更多的文字的類型已經宣佈後?即。而不涉及上述聲明(因爲它可能位於不屬於我的文件中)。

https://www.typescriptlang.org/docs/handbook/advanced-types.html


東西不起作用:

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 
type Easing = Easing | 'uneasy' 

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 
type Easing |= 'uneasy' 

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 
type Easing = "ease-in" | "ease-out" | "ease-in-out" | 'uneasy'; 

所有這些都由於錯誤「重複標識符Easing」而失敗。「


如果不允許,爲什麼不呢?爲什麼它允許做類似的枚舉?我不明白他們有什麼不同。

enum Easing { 
    EaseIn, 
    EaseOut, 
    EaseInOut 
} 

// works just fine 
enum Easing { 
    Uneasy = 3 
} 
+0

你應該給出一個你正在試圖解決的潛在問題的跡象。你所要求的具體事情不是解決任何問題的方法,而是許多問題的原因! –

+0

這是一個問題的解決方案,認爲'不安'被認爲是'緩和'的無效值,儘管它可能對我正在做的事情有效。 TS不應該假裝比編寫它的人更瞭解代碼。 –

+0

國際海事組織的字符串字面類型真的很擅長捕捉錯字,但我覺得應該有一種方式有意識地告訴打字稿「好吧,我知道我在做什麼,所以請讓我使用這個值」 –

回答

0

如果你能這樣做,它會產生問題,考慮以下因素:

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 
function addClassName(el: HTMLElement, a: Easing) { 
    el.className += " " + a; 
} 

所以這是一個不同的文件的一部分,誰曾寫道,只希望處理3特定值由Easing定義。
通過改變你可能會破壞該代碼。

什麼,你可以在你的文件做的是:

type Easing2 = Easing | "uneasy"; 

然後用這個來代替Easing

+0

在這個例子中,代碼僅僅期望'Easing'的值,但是它不會被其他值所保護。 'addClassName(EL, '不安' 作爲字符串作爲緩動);' 外觀,沒有TS錯誤。 已經有可能傳遞未定義的值,所以我不同意我的更改會破壞那些無法防範的代碼。 –

+0

(原諒我,如果我誤解了什麼'as'運營商確實和我以前的評論是錯誤的) –

+0

可以明顯地繞過編譯器,你也可以只使用'作爲any'上的一切,但是那有什麼用打字稿的地步?編譯器不會讓你傳遞其他值,如果你決定不聽,那麼你的代碼可能會中斷。 –