创建“任何”类型的扩展方法错误:“任何”仅引用类型,但在此处被用作值

问题描述

我想创建一种扩展方法,该扩展方法如果是NAN或NULL,则将任何类型的字符串或数字转换为空字符串,但是会出现此错误


declare global {
    interface Any {
        NullToEmptyString(): any;
    }
}

Any.prototype.NullToEmptyString = function (): any{ <--- Here is error
    return this == null ? '' : this;
}

解决方法

any纯粹是一种类型,它实际上不在类型系统之外。而且您无论如何都无法向null添加方法,这只会导致异常。您应该制作一个采用any参数的方法:

function nullToEmptyString(arg: any): any {
    return arg == null ? '' : arg;
}
,

interface来自https://www.typescriptlang.org/docs/handbook/interfaces.html的定义:

TypeScript的核心原则之一是类型检查的重点是 值的形状。有时称为“鸭子打字”或 “结构子类型化”。在TypeScript中,接口充当以下角色 命名这些类型,是定义合同的有效方法 在您的代码中以及与您外部代码的合同 项目。

并且,接口未编译到打字稿文件的javascript端。

例如:

interface Hello {

}

class Hello2 {

}

转换为:

var Hello2 = /** @class */ (function () {
    function Hello2() {
    }
    return Hello2;
}());

因此,要使代码正常工作,您需要使用类而不是接口(但可能无法实现您的其他目标):

export { };

declare global {
    class Any {
        NullToEmptyString(): any;
    }
}

Any.prototype.NullToEmptyString = function (): any {
    return this == null ? '' : this;
}

将代码转换为:

"use strict";
exports.__esModule = true;
Any.prototype.NullToEmptyString = function () {
    return this == null ? '' : this;
};