2016-06-29 38 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) { ... })