TypeScript扩展字符串的新类

TypeScript扩展字符串的新类,typescript,primitive-types,Typescript,Primitive Types,我目前正在尝试设置一个类“AdvancedString”。这个类应该通过像isJSON这样的方法来扩展字符串。现在看起来是这样的 class AdvancedString extends String { isJSON():boolean{ var itIs = true; try{ JSON.parse(this.toString()); } catch (err) { itIs = fal

我目前正在尝试设置一个类“AdvancedString”。这个类应该通过像isJSON这样的方法来扩展字符串。现在看起来是这样的

class AdvancedString extends String {
    isJSON():boolean{
        var itIs = true;
        try{
            JSON.parse(this.toString());
        } catch (err) {
            itIs = false;
        }       

        return itIs;
    }
}

export{ AdvancedString}
现在它还不太管用。如果我用“SampleString”创建一个新实例,我将得到

如果我这么做,我会得到正确的值

sample.toString()
// "SampleString"
然而,当我直接调用它时,我希望它的行为像普通字符串一样

sample === "SampleString"
// should return true and sample.toString() === "SampleString"
// should not be necessary

有没有办法在TypeScript中实现这一点,或者这是不可能的?我想使用一个单独的类,而不是将我的方法添加到string的原型中。不幸的是,这是不可能的。对象仍然是对象,并且不是原始值(字符串)的
==

相信我,我在这个问题上花了几十个小时,你什么都做不了

您可以对String.prototype.isJSON进行变异

String.prototype.isJson = () => 'your logic here'
但这并不是一个非常干净的解决方案,除非你确信这些代码只存在于你的应用程序中


p.S.Typescript与此问题无关。

==
要求类型相同。您的
AdvancedString
类型的实例与基元字符串或对象字符串的类型不同,因此
=
将始终为false<代码>新字符串(“”==“”也是false,原因相同;前者是字符串对象,后者是基本字符串

您的
AdvancedString
=
基本字符串,但是(似乎)只有在您本机使用
class
时才是;当我使用TypeScript传输
语法时,它失败了。但它在本地起作用:

class AdvancedString扩展字符串{
isJSON(){
var=true;
试一试{
parse(this.toString());
}捕捉(错误){
它=假;
}
回归性炎症;
}
}
const s=新的高级字符串(“foo”);
console.log(s==“foo”);//假的

console.log(s==“foo”);//真的
谢谢你的回答。不幸的是,我有点期待:(“…这样没有访问符号的人就不能访问该方法…”这是不正确的:
Object.getOwnPropertySymbols(String.prototype)
将允许任何请求该符号的代码访问该符号。符号根本不提供任何形式的隐私。
String.prototype.isJson=()=>'此处的逻辑
“永远不要扩展具有可枚举属性的内置原型。因此,某些地方可能会出现问题。如果您扩展内置原型(在某些有限的上下文中可以这样做),使用
Object.defineProperty
。哦,真的吗?我不知道。谢谢。所以这会让事情变得更难。让它不可枚举也会有点帮助。FWIW,我更新了一个关于可能的缺点的说明。。。
String.prototype.isJson = () => 'your logic here'