当前位置: 首页 > 知识库问答 >
问题:

在TypeScript中构建具有属性的函数对象

邵亦
2023-03-14

我想创建一个函数对象,它也有一些属性。例如,在JavaScript中,我将执行以下操作:

var f = function() { }
f.someValue = 3;

现在在TypeScript中,我可以将这种类型描述为:

var f: { (): any; someValue: number; };

然而,如果不需要石膏,我实际上不能建造它。如:

var f: { (): any; someValue: number; } =
    <{ (): any; someValue: number; }>(
        function() { }
    );
f.someValue = 3;

如果没有石膏,你将如何建造这个?

共有3个答案

岳锦
2023-03-14

TypeScript旨在通过声明合并来处理这种情况:

您可能还熟悉创建函数,然后通过向函数添加属性进一步扩展函数的JavaScript实践。TypeScript使用声明合并以一种类型安全的方式构建这样的定义。

声明合并让我们可以说某个东西既是一个函数又是一个名称空间(内部模块):

function f() { }
namespace f {
    export var someValue = 3;
}

这保留了键入,并允许我们编写f()f.someValue。当为现有的JavaScript代码编写.d.ts文件时,使用声明

declare function f(): void;
declare namespace f {
    export var someValue: number;
}

在TypeScript中,向函数添加属性通常是一种令人困惑或意外的模式,因此请尽量避免,但在使用或转换较旧的JS代码时可能是必要的。这是唯一适合将内部模块(名称空间)与外部模块混合使用的情况之一。

吴谦
2023-03-14

现在使用对象(typescript2.x)很容易实现这一点。分配(目标、源)

例子:

这里的魔力在于对象。分配

强制将其解析为已知接口也是很简单的。例如:

interface Foo {
  (a: number, b: string): string[];
  foo: string;
}

let method: Foo = Object.assign(
  (a: number, b: string) => { return a * a; },
  { foo: 10 }
); 

哪些错误是由不兼容的键入引起的:

错误:foo:number不可分配给foo:string
错误:number不可分配给string[](返回类型)

注意:如果针对较旧的浏览器,您可能需要重新填充Object.assign。

苏坚成
2023-03-14

更新:这个答案在早期版本的TypeScript中是最好的解决方案,但是在新版本中有更好的选项(请参阅其他答案)。

接受的答案是有效的,在某些情况下可能是必需的,但是有一个缺点,即没有为构建对象提供类型安全。如果您试图添加未定义的属性,此技术至少会引发类型错误。

interface F { (): any; someValue: number; }

var f = <F>function () { }
f.someValue = 3

// type error
f.notDeclard = 3
 类似资料:
  • 问题内容: 我是Java的新手,并且开始使用Java 。我想做的是为学生创建一个。每个学生都有与其相关的不同属性()。我试图弄清楚如何使用此属性添加新的学生对象。这是我所拥有的: 问题答案: 您需要的是以下内容:

  • 问题内容: 以下是两种方法: 具有所有类属性的构造函数 优点:我必须输入确切数量的参数类型,所以如果出现错误,编译器会警告我(顺便说一句,有什么方法可以防止错误地在参数列表中切换两个Integer的问题?) 缺点:如果我有很多属性,则实例化行可能会变得很长,并且可能跨越两行或更多行 setter和默认的空构造函数 优点:我可以清楚地看到自己的设置,因此,如果我做错了什么,我可以在键入时立即查明它(

  • 问题内容: 是否有可能从具有特定属性的数组中获取对象?还是我需要遍历数组中的所有对象并检查属性是否是我正在寻找的特定对象? 编辑:谢谢你给我正确的方向,但我有一个转换此问题。 //再编辑一次:好的,如果只有一个特定的结果?这也是可行的方法吗? 问题答案: //这不起作用-NSArray不是Images的子类型-那么如果只有1种可能的结果怎么办? 您无法在编译时证明数组上只有一个可能的结果。您实际要

  • 尝试创建静态函数可授予对属性 xdate 的访问权限,该属性已在构造函数中初始化(在 typescript 1.5.3 中)。 this.xdate可在所有其他实例方法中访问。它在静态方法中仍然不可访问。 在静态方法中,我是否可以让this.xdate访问? 以下是我的代码:- 任何指点都会有很大的帮助。(如果这是一个重复的问题,请事先道歉) /* UglyHack#1:由于静态方法甚至在对象实例

  • 我希望data是否必传由A[T]是否有必传属性决定。如何做呢?

  • 问题内容: 用Javascript将是: 但是Python中相同的语法会创建一个字典,那不是我想要的 问题答案: 有两种功能用途。