如何从 TypeScript 函数返回类
How can I return a class from a TypeScript function?
我正在使用带有依赖项注入库的TypeScript,该库的工作方式与Angular 1非常相似 - 基本上:使用依赖项作为参数注册工厂。
这就是我在 ES6 中注册类的方式
export let factory = () => {
return class Foo {}
};
如果我在打字稿中写同样的东西:
export let factory = () => {
return class Foo {}
};
它无法编译并出现错误
错误 TS4025:导出的变量"工厂"具有或正在使用私有名称"Foo"。
有没有办法允许 TypeScript 从工厂函数返回类?
快速回答
更改此内容:
export let factory = () => {
return class Foo {}
};
对此:
export let factory = () : any => {
return class Foo {}
};
<小时 />更长的答案
此错误可能由 tsconfig.json 设置触发/强制:
{
"compilerOptions": {
...
"declaration": true // this should be false or omitted
但这不是原因,这只是一个触发器。真正的原因(如此处所述,导出返回类的函数时出错:导出的变量具有或正在使用私有名称(来自 Typescript 编译器
当 TS 编译器找到这样的语句时
let factory = () => { ...
它必须开始猜测返回类型是什么,因为缺少该信息(检查占位符: <returnType>
(:
let factory = () : <returnType> => { ...
在我们的例子中,TS 会很快发现,返回的type
很容易猜到:
return class Foo {} // this is returned value,
// that could be treated as a return type of the factory method
因此,如果我们有类似的语句(这与原始语句完全不同,但让我们尝试将其用作示例来阐明会发生什么(,我们可以正确声明返回类型:
export class Foo {} // Foo is exported
export let factory = () : Foo => { // it could be return type of export function
return Foo
};
这种方法是有效的,因为Foo
类是输出的,即对外部世界可见。
回到我们的情况。我们要返回未导出的类型。然后,我们必须帮助 TS 编译器决定返回类型是什么。
它可以是明确的任何:
export let factory = () : any => {
return class Foo {}
};
但更好的是有一些公共接口
export interface IFoo {}
然后使用这样的接口作为返回类型:
export let factory = () : IFoo => {
return class Foo implements IFoo {}
};
老问题的迟到回答:
您需要在工厂方法之外定义类,并使用"typeof"定义返回值。
class Foo {}
export const factory = (): typeof Foo => {
return Foo;
};
我认为这是一种正确的方法:
export let factory = () => {
class Foo {/* ... */}
return Foo as (new () => { [key in keyof Foo]: Foo[key] })
};
在操场上看看
您还需要导出该类,以便该方法的使用者可以访问该类型。
通常,工厂将返回一个实例,而不是一个类或构造函数。
更新的示例
export class Foo {};
export let factory = () => {
return Foo;
};
使用 ES6,您不需要导出类类型,但使用 TypeScript,您绝对应该导出类型签名。
我发现单独提供的解决方案满足:
export class MyClass {
...
}
export type MyClassRef = new (...args: any) => MyClass;
鉴于该签名,我可以使用 MyClassRef
作为返回值的一种类型:
exposeMyClass(): MyClassRef {
return MyClass;
}
我正在为同样的错误而苦苦挣扎。我的解决方案是删除
"declaration": true
从tsconfig.json
或将其设置为 false
.
您是否正在寻找从函数返回类的类型?下面是一个代码片段,我们如何在 TypeScript 中实现工厂,类似于其他语言。
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
class Factory{
getObject(msg:string): Greeter {
return new Greeter(msg);
}
}
var greeter = new Factory().getObject("Hi");
console.log(greeter.greet());
- 使用返回函数sinde.attr()jquery元素
- 从自执行函数返回函数的Javascript性能命中率
- Node Express Handlebars帮助程序未返回函数的结果
- 未在Firefox中执行PageMethod的返回函数
- 对返回函数的函数感到困惑
- 从承诺返回不返回函数会导致警告
- 从函数返回函数而不调用返回的函数
- Javascript,闭包中的返回函数如何与外部函数连接
- 为什么Coderbyte.com's的Javascript模板喜欢返回函数的原始参数
- 对象函数返回函数而不是值
- 从外部函数(数组)了解返回函数(x)
- 从Javascript类对象返回函数
- 调用Typescript setter don't返回函数,尽管关联的getter可以工作
- 使用依赖注入在 JavaScript 中返回函数
- 通过单击JSP和javascript加载两个返回函数
- 需要说明:无法理解返回函数的javascript
- 简单的onClick返回函数不起作用
- 为什么这个闭包返回函数
- JS函数返回函数供以后使用-未定义参数
- Coffeescription类中的方法返回函数而不是字符串