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