2016-06-29 35 views
1

我試圖使用class關鍵字作爲功能標識符在像一個名稱空間:使用關鍵字作爲標識符打字稿

namespace X { 
    export function class(...) { ... } 
} 

本身延伸的函數(function X (...) { ... })的命名空間。

這有什麼辦法可以做到嗎?

+0

我不確定你在問什麼。你想調用你的函數'class'嗎? –

+2

認真考慮你爲什麼需要命名'class'。可能要使用衆多在線詞典中的一個來查找替代詞。 –

+0

沒有嚴重的需要,我只是在玩這個語言,想試着創建一個名字爲'class'的函數的快捷方式 – gbieging

回答

4

在TypeScript中沒有辦法做到這一點。你必須以某種方式在命名空間中聲明一個帶引號的名字,但是沒有這樣做的語法。也不可能聲明一個名爲class的類型,所以你以兩種不同的方式被阻止。

如果您只需要它在運行時存在並且不需要任何類型的系統功能,則可以編寫(<any>X)['class'] = class { ... }

+0

我接受您的答案,因爲它的答案問如問,但我找到了解決問題的方法。我發佈了另一個答案。 – gbieging

1

如果你想要做的是命名一個方法class這是一個很大的編程語言不容忽視。 class就是你所說的保留字:https://en.wikipedia.org/wiki/Reserved_word

你可以調用方法「Class」來代替,並且會有更好的結果。

+1

不少語言讓你引用關鍵字來使它們成爲標識符,比如F#和Scala。當源語言對編譯目標具有不同的標識符規則時,這很有用,就像打字稿一樣。 – Lee

+0

有趣,所以如果我想要,我可以調用函數「if」或「then」?似乎有點不合邏輯。我確實認識到標識符規則的不同......儘管如@MikeMcCaughan所說的那樣,仍然在努力爭取這一點。 –

+1

是的,你可以定義一個'if'函數。在F#中,您可以這樣做:'let'''if if'''x = printfn'%A「x',儘管它對於使用不同保留關鍵字的其他語言消費更有用。例如,在scala中調用'Thread.yield',你必須使用'Thread。\'yield'()',因爲'yield'是scala中的一個關鍵字,而不是java中的關鍵字。 – Lee

0

我找到了解決方法。

interface I { 
    (foo: Bar): Baz 
    class(foo: Bar): Baz 
} 

const X = (function (X: any) { 
    X.class = function (foo: Bar) { ... } 
    return <I>X 
})(function (foo: Bar) { ... })