2015-04-12 80 views
0

我正在審查打字稿,並偶然發現了一件奇怪的事情。我使用默認情況下通過npm安裝的「[email protected]」。如果我有一個代碼declare的變種,然後用它來分配,所有工作正常。爲什麼'聲明'在打字稿中'延伸'不起作用?

.TS

declare var a; 
var b = a; 

的.js

var b = a; 

但是,如果我聲明一個變量,然後嘗試從它擴展一個類(假設變量是一個有效的打字稿類標識符)打字稿失敗,出現「名稱」未找到的奇怪錯誤:

名.TS

declare var a; 
class b extends a {} 

錯誤

test.ts(2,17): error TS2304: Cannot find name 'a'. 

任何提示爲什麼發生這種情況又是什麼打字稿指爲 「名」?肯定它不是一個「標識符」,因爲標識符似乎根據第一個版本被完全檢測到。

+3

爲什麼你會從一個變量擴展一個類嗎? –

+0

@Jimmy T.合理的問題,似乎是問題的根源。但是我怎麼能指示Typescript這個標識符「a」實際上是指類,並且typescript只需要生成擴展代碼(假設它在這裏)(第三方縮小的lib)呢? – grigoryvp

回答

1

我..how可指示標識「一」,實際上是指階級,打字稿只需要生成擴展代碼假設它是這裏的TypeScript。在第三方縮小庫中定義。是否有任何方式可以在不描述它的內部結構的情況下進行轉發聲明?它的原型是node.jsevent.EventEmitter

不知道如何破解最新TypeScript編譯器去做你想要什麼,從你的問題的描述其實我不明白你想要什麼...

...但我偶然發現需要在第三方庫中聲明類型,尤其是event.EventEmitter變量類型。我已經通過聲明interface來解決這個需求,其中複製/粘貼描述了內部結構的重要成員。

它打上TODO因爲我找不到那個時候更好的解決方案,但它可以爲解決辦法工作你的情況,以及

interfaces.d.ts

/// <reference path="../../vendor/borisyankov/DefinitelyTyped/node/node.d.ts"/> 

interface IChildProcess /* TODO: should be "extends child_process.ChildProcess" */ { 
    stdin: NodeJS.WritableStream; 
    stdout: NodeJS.ReadableStream; 
    stderr: NodeJS.ReadableStream; 
    pid: number; 
    on(event: string, listener: Function): NodeJS.EventEmitter; 
} 

some.ts

var process: IChildProcess; 

process = child_process.spawn("cmd.exe", args, { 
    cwd: options.cwd || process.cwd(), 
    stdio: options.stdio || 'inherit', 
    env: process.env, 
    detached: false 
}); 
0

您想擴展一個類並且而不是的一個對象實例。

class A 
{ 
    // stuff 
} 

class B extends A 
{ 
    // stuff 
} 
+0

是的,就是這樣,但'A'是在第三方縮小庫中定義的。是否有任何方式可以在不描述它的內部結構的情況下進行轉發聲明? – grigoryvp

+0

那你爲什麼要擴展它呢?你甚至不知道它是原型。 –

+0

我知道它的原型是因爲它是'node.js'' event.EventEmitter' :(。如果代碼是用手工製作的,它就可以完美工作,現在我希望它由TypeScript製作,但是這個奇怪的問題出現了。 – grigoryvp