Javascript 基类型字符串上的TypeScript重载方法

Javascript 基类型字符串上的TypeScript重载方法,javascript,typescript,overloading,Javascript,Typescript,Overloading,TypeScript版本:1.6 我正在尝试为Stringsreplace-函数添加另一个重载函数,该函数应具有以下签名: replace(searchValue: string, replaceValue: any): string; 所以它可以像 "someString".replace("replaceMe", $(evt.target).data("row-id")) 我需要从开始的任何。数据定义为: data(key: string): any; 我的String.d.ts(声明

TypeScript版本:1.6

我正在尝试为
String
s
replace
-函数添加另一个重载函数,该函数应具有以下签名:

replace(searchValue: string, replaceValue: any): string;
所以它可以像

"someString".replace("replaceMe", $(evt.target).data("row-id"))
我需要从
开始的
任何
。数据
定义为:

data(key: string): any;
我的
String.d.ts
(声明)

My
String.ts
(实现)

出现以下错误,我不确定原因和修复方法:

错误TS2322 Type'(searchValue:string,replaceValue:any)=>string'不可分配给类型{(searchValue:string,replaceValue:string):string;(searchValue:string,replace:(substring…)。 参数“searchValue”和“searchValue”的类型不兼容。 类型“string”不可分配给类型“RegExp”。 类型“String”中缺少属性“exec”

编辑#1

最后,我只声明了
replace
(并移除了实现),以满足编译器的要求:

interface String {
    /**
      * Replaces text in a string, using a regular expression or search string.
      * @param searchValue A string that represents the regular expression.
      * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.
      */
    replace(searchValue: string, replaceValue: any): string;
}
在内部调用库的
replace
-函数时,这是否仍然是错误的

编辑#2

如果不使用任何东西,那么自己的VisualStudio就会大喊大叫

它显示的演员阵容(重弹手)

使用示例4.1(MartyIX)

执行
“someString.replace”(“replaceMe”,$(evt.target).data(“行id”))
应该可以工作,因为
任何
都可以分配给
字符串
。我不确定为什么会出现错误,但我建议确保没有从
lib.d.ts
中删除
字符串
作为
替换
的第一个参数的函数签名。您可以通过转到定义replace(将光标放在replace上并点击F12)并确保它具有下面所示的所有函数签名。您还可以尝试暂时禁用resharper,以查看这是否会使错误消失

顺便说一句,要通过重写
String.prototype.replace
来修复错误,它已经具有以下可能的函数签名:

replace(searchValue: string, replaceValue: string): string;
replace(searchValue: string, replacer: (substring: string, ...args: any[]) => string): string;
replace(searchValue: RegExp, replaceValue: string): string;
replace(searchValue: RegExp, replacer: (substring: string, ...args: any[]) => string): string;
searchValue
RegExp
时,写入的内容不兼容,因此您需要使用联合类型更改函数签名以允许
字符串和
RegExp

String.prototype.replace = function(searchValue: string | RegExp, replaceValue: any) {
    // omitted
}
我不确定您想做什么,因为函数将执行无限循环。也许您想保留对原始
字符串.prototype.replace
的引用并调用它?请记住,当您指定给
字符串.prototype.replace
时,会覆盖原始函数

总体而言,不要执行此处正在执行的操作。查找“不要修改您不拥有的对象”了解我的意思。如果您创建自己的单独函数来执行此操作会更好,因为现在此替换函数会破坏使用它的任何代码。如果您使用的任何库都使用
replace
方法,您将获得非常奇怪的行为,并且很难跟踪问题。

我的看法:

1) 以下代码不会报告我的计算机上的任何错误:

/// <reference path="typings/jquery/jquery.d.ts" />

"someString".replace("replaceMe", $('#test').data("row-id"));
3) 首先,实现是错误的,因为您替换了
String.prototype.replace
,然后您希望它调用
String.prototype.replace
的本机实现,但事实并非如此。实际上,您的实现根本不执行任何替换功能

String.prototype.replace = (searchValue: string, replaceValue: any):string =>
{
    if (replaceValue instanceof String) {
        var stringReplacement = replaceValue.toString();
        return String.prototype.replace(stringReplacement, replaceValue);
    } else {
        return replaceValue;
    }
}
4) 这些代码在以下情况下运行良好:

设n:any=1;
“someString”。替换(“replaceMe”,n);
“someString.replace(“replaceMe”,5);//显式强制转换

所以,我对typescript一无所知,但我看不出这个方法能做什么,你不能用
String.prototype.replace
?似乎TS函数在参数类型上是不变的,
f(String,any)
不能保存到
f(String,String)类型的值中
@Mathletics它在编译时出错,因为在typescript中,
replace(string,any)没有定义
@BartekBanachewicz:所以这是因为
任何
字符串都无法区分?我有理由不做你所描述的事情。不触摸我不拥有的对象是完全有道理的。我的问题是
编辑#1
。这样可以吗?至少我不想调用
。toString()
每次为了满足编译器的要求,我认为,您应该创建一个独立于
接口字符串
的函数,该函数将执行您想要的操作。例如
StringUtils.myCustomReplaceFunction(“someString”、“replaceMe”、$(evt.target).data(“row id”));
.1)它向我显示了VS中描述的错误。我的设置是在%programfiles%中使用TSCompiler 1.6,还是指其他一些设置?2)很好,但我的编辑(使3)过时)仍然没有调用正确的“内部”吗替换?3)我删除了自己的实现4)让我检查1)您已经为自己的实现显示了错误。而不是实际的命令:
“someString”.replace(“replaceMe”,$(evt.target).data(“row id”))
3)当您删除自己的实现时,这是很好的。因此,
edit#1
是一个正确的解决方案。很抱歉,由于混淆,我的“实现”在评论过程中发生了更改。我的问题现在可以在
edit#2
中看到(这就是我最初开始考虑过载的原因)和您的示例(4.1)它没有显示任何错误。我只需要将cast放在那里,或者使用
let变量:any=something
。它很容易阅读,读者很快就能理解。
/// <reference path="typings/jquery/jquery.d.ts" />

"someString".replace("replaceMe", $('#test').data("row-id"));
module Project.Utils {
    export class String {   
        public replace = (searchValue: string, replaceValue: any):string =>
        {
            // some replace implementation
        }
    }
}
String.prototype.replace = (searchValue: string, replaceValue: any):string =>
{
    if (replaceValue instanceof String) {
        var stringReplacement = replaceValue.toString();
        return String.prototype.replace(stringReplacement, replaceValue);
    } else {
        return replaceValue;
    }
}
let n:any = 1; 
"someString".replace("replaceMe", n); 

"someString".replace("replaceMe", <any>5); // explicit cast