为什么Typescript不警告我正在定义的函数与接口声明不匹配,但如果我试图调用该函数,它会警告我.

interface IFormatter {
    (data: string, toUpper : boolean): string;
};

//Compiler does not flag error here.
var upperCaseFormatter: IFormatter = function (data: string) {
    return data.toUpperCase();
}  

upperCaseFormatter("test"); //but does flag an error here.

推荐答案

该接口确保实现该接口的函数的所有调用者都提供所需的参数-datatoUpper.

因为TypeScript知道JavaScript不介意传递未使用的参数,所以它在实现中巧妙地允许这样做.

为什么这样可以?因为这意味着您可以在不影响调用代码的情况下替换接口的任何实现.

示例:您可以替换IFormatter个实现,代码就可以运行了.

interface IFormatter {
    (data: string, toUpper: boolean): string;
};

var upperCaseFormatter: IFormatter = function (data: string) {
    return data.toUpperCase();
}

var variableCaseFormatter: IFormatter = function (data: string, toUpper: boolean) {
    if (toUpper) {
        return data.toUpperCase();
    }

    return data.toLowerCase();
}

// Switch between these at will
//var formatter = upperCaseFormatter;
var formatter = variableCaseFormatter;

formatter("test", true);

如果TypeScript没有这样做,那么你的upperCaseFormatter就必须有一个名为toUpper的参数,这个参数在函数中的任何地方都没有使用过——这会降低代码的可读性.

Typescript相关问答推荐

在控制器中使用@ DeliverGuards时实现循环依赖项时未定义的依赖项

如何在类型脚本中使用条件陈述循环

排序更改数组类型

类型脚本中的Gnomeshell 扩展.如何导入.ts文件

在Angular中,如何在文件上传后清除文件上传文本框

Angular中的其他服务仅获取默认值

如何在第一次加载组件时加载ref数组

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

接口中函数的条件参数

Angular NgModel不更新Typescript

已解决:如何使用值类型限制泛型键?

ANGLING v17 CLI默认设置为独立:延迟加载是否仍需要@NgModule进行路由?

Angular material 无法显示通过API获取的数据

为什么上下文类型在`fn|curred(Fn)`的联合中不起作用?

如何在具有嵌套数组的接口中允许新属性

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

如何为对象数组中的每个条目推断不同的泛型

在ts中获取级联子K类型?

我可以使用对象属性的名称作为对象中的字符串值吗?

如何让Record中的每个值都有独立的类型?