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

如何在typescript中作为getter编写泛型类的扩展

潘国源
2023-03-14

所以我学会了如何在打字稿中进行扩展:

interface Array<T> {
  lastIndex(): number
}

Array.prototype.lastIndex = function (): number { return this.length - 1 }

但是如何从中制作一个吸气剂?例如:

interface Array<T> {
  get lastIndex(): number
}

Array.prototype.lastIndex = function (): number { return this.length - 1 }

所以我可以在代码someArray.lastIndex中调用is作为getter?

我找到了这个答案,但代码无法为泛型类型编译,这样写也很丑陋,但也许我在打字稿中要求太多:如何使用 get 属性扩展打字稿类?

共有2个答案

汪德明
2023-03-14

像这样怎么样:

interface Array<T> {
    lastIndex(): number;
    lastValue(): T
}

Array.prototype.lastIndex = function (): number { return this.length - 1 };
Array.prototype.lastValue = function (): any { return this[this.lastIndex()] };

let myArray = ['111,', '43242asd', 'asdasdas'];
console.log(myArray.lastValue());

谭凯
2023-03-14

就打字稿接口而言,getter是一个实现细节。您可以将其声明为普通的只读属性并将其实现为getter。

interface Array<T> {
  readonly lastIndex: number
}

Object.defineProperty(Array.prototype, "lastIndex", {
  get: function () { return this.length - 1  }
});

使用ES6速记语法,

Object.defineProperty(Array.prototype, "lastIndex", {
  get() { return this.length - 1  }
});
 类似资料:
  • 我用以下代码提炼出了问题的本质: 完整来源 我有基类和Derive, Derived2: 现在我有了变量t,它可以是派生的或派生的2的实例。它也可以在运行时多次更改。 我有一个函数,它检查t是否是传递类的实例,如果它是传递类的实例或未定义的实例,则返回t。 当我调用Check Top(Derive)时,它的返回类型应该是Derive。但是在上面的jsdoc中,它的返回类型是“typeof Deri

  • 我想创建如下界面: 然后我们可以将它用于一个新类: 我想对s做同样的事情。在纯JavaScript中,我可以使类型,例如,满足以下接口: 但TypeScript不允许我这样做: 有办法做到这一点吗?

  • 问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地

  • 问题内容: 我上课了。我怎么能说我想成为某个班级的实施者?编写根本无法编译。 问题答案: 使用代替。

  • 我在玩TypeScript中的条件类型。我想用条件返回类型编写一个函数。如果函数被传递一个字符串,它将返回一个名称,否则它将返回一个Id。 我在返回语句中得到以下错误: 我错过了什么?Thnx! 编辑:直接摘自Anders Hejlsberg在Build 2018上的演讲:https://youtu.be/hDACN-BGvI8?t=2241 他甚至说“我们不再需要写函数重载了…” 如果我将代码更

  • 一些背景知识,以防我为实际想要实现的目标解决了错误的问题:我的目标是编写一个函数: 它检查和是否具有相同的类型并相等,然后返回提供的(我们当时知道它与相同--T可能不是内射的,但它是一个函数!)或,否则。 我已经找到了一个解决办法,将违规的包装在中,使用,然后再次打开包装: 这种解决方法是完全可以接受的,但我希望去掉虚假的类型。