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

用函数创建自己的类型

方鸿羲
2023-03-14

我试图创建自己的类型,在这些类型上我可以使用点语法调用函数。

let myOwnType: myByteType = 123211345;
myOwnType.toHumanReadable(2);
interface Number {
    /**
     * Returns a string representation of an object.
     * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.
     */
    toString(radix?: number): string;

    /**
     * Returns a string representing a number in fixed-point notation.
     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
     */
    toFixed(fractionDigits?: number): string;

    /**
     * Returns a string containing a number represented in exponential notation.
     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
     */
    toExponential(fractionDigits?: number): string;

    /**
     * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.
     * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.
     */
    toPrecision(precision?: number): string;

    /** Returns the primitive value of the specified object. */
    valueOf(): number;
}
interface Bytes {
  toHumanReadable(decimals: number): bytesToHumanReadable;
  bytesAs(unit: string): string;
}


function bytesToHumanReadable (decimals: number) {
  // convert bytes to GB, TB etc..
}

我如何创建自己的类型并像普通类型一样使用它们?我知道接口也不工作,但这是我的第一个猜测。

共有1个答案

闽哲
2023-03-14

问题是我找不到函数bodys在哪里以及如何定义。

它们由JavaScript引擎定义,作为标准库的一部分。您可以在number.prototype上找到它们。它的工作原理如下:当您试图访问一个原语的属性(例如Somenumber.toString())时,JavaScript引擎会在该原语的对象类型原型上查找该属性(number=>number,string=>string,等等)。如果您正在进行调用,它将调用该方法,传入基元(在严格模式下)或基元的对象包装器(在宽松模式下)。

您不能定义自己的基元类型,这只能在JavaScript规范级别上完成。

class Byte {
    constructor(public value: number) {
    }
    yourMethodHere() {
        // ...
    }
}

例如,这将向数字添加Tohex方法:

// Adding it to the type
interface Number {
    toHex(): string;
}
// Adding the implementation
Object.defineProperty(Number.prototype, "toHex", {
    value() {
        return this.toString(16);
    },
    enumerable: false, // This is the default, but just for emphasis...
    writable: true,
    configurable: true
});

操场上的活生生的例子

 类似资料:
  • 当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论如何在 application/libraries 文件夹中建立你自己的类库,并使它们与全框架的资源维持分离. 作为一个额外的功能,当你需要在原始类中简单地添加一些功能时,CodeIgniter能使你的类库extend 自原始类.你甚至可以通过在ap

  • 好吧,所以我试图在Java创建自己的LinkedList类(带有泛型类型),但是遇到了一些问题。我创建了一个LinkedListNode类,它基本上设置并获取next和right指针以及节点的键。我的LinkedList类代码发布在下面,如果您编译并运行,您会发现它没有按照应该的方式设置列表。此刻,我正在尝试在节点x之后插入节点y,但我的打印输出看起来像: 键:5-上一键:6-下一键:6键:6-上

  • 如果你只需要掌控一个应用的全部的消息和触发的事件,那么使用默认的**/**命名空间即可。如果你想要利用第三方代码,或者分享你的代码给别人,http://socket.io提供了一种命名一个socket的途径。 使用多路由控制一条单一的连接是有好处的。比如下方的示例代码,客户端发起两个WebSocket连接,而服务器端使用多路由技术仅仅只需要建立一个连接。 服务器端(app.js) var io =

  • 如果您在开发共享库的公司工作,或者您在开源或商业库中工作,则可能需要开发自己的自动配置。 自动配置类可以捆绑在外部jar中,仍然可以通过Spring Boot获取。 自动配置可以与“启动器”相关联,该“启动器”提供自动配置代码以及您将使用它的典型库。 我们首先介绍了构建自己的自动配置需要了解的内容,然后我们将继续介绍创建自定义启动器所需的典型步骤。 可以使用演示项目来展示如何逐步创建启动器。 4.

  • 在Java你有很多列表函数。例如: List.size(),List.is空()... 是否有可能使我自己的函数,如List.null或空(),我怎么能做到这一点? 这会对我帮助很大。

  • 我读了很多关于这个问题的文章,我确实找到了一些处理它的文章——但不幸的是,我不能真正理解如何解决我的问题。 现在我正在创建WebService(使用Tomcat 7),我想共享接口。我有大约8个相互关联的接口。例如: 问题是,在创建WAR(用于接口C)文件并尝试在tomcat中部署webservice后,tomcat出现了一个错误,如下所示: 严重:WSSERVLET11:无法分析运行时描述符:c