为什么'声明'在打字稿中'延伸'不起作用?

为什么'声明'在打字稿中'延伸'不起作用?

问题描述:

我正在审查打字稿,并偶然发现了一件奇怪的事情。我使用默认情况下通过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

我..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 
}); 

您想扩展一个类并且而不是的一个对象实例。

class A 
{ 
    // stuff 
} 

class B extends A 
{ 
    // stuff 
} 
+0

是的,就是这样,但'A'是在第三方缩小库中定义的。是否有任何方式可以在不描述它的内部结构的情况下进行转发声明? – grigoryvp

+0

那你为什么要扩展它呢?你甚至不知道它是原型。 –

+0

我知道它的原型是因为它是'node.js'' event.EventEmitter' :(。如果代码是用手工制作的,它就可以完美工作,现在我希望它由TypeScript制作,但是这个奇怪的问题出现了。 – grigoryvp