关键词:
【中文标题】打字稿函数接口【英文标题】:Typescript Function Interface 【发布时间】:2013-01-26 15:40:08 【问题描述】:为什么 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.
【问题讨论】:
【参考方案1】:该接口确保实现该接口的所有函数调用者都提供所需的参数 - data
和 toUpper
。
因为 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
的参数,该参数未在函数中的任何地方使用 - 这会降低代码的可读性。
【讨论】:
但是使用upperCaseFormatter
有一个冗余的布尔值:upperCaseFormatter("test", true); // excluding the 'true' will result in a compiler warning
。因此,接口是错误的,应该是:interface IFormatter (data: string, toUpper? : bool): string;
但这意味着您可以只使用variableCaseFormatter('test');
调用variableCaseFormatter
,而无需指定toUpper
,尽管它在函数签名中。有关我当前困惑的更简单示例,请在此处查看我的问题:***.com/questions/23305020
@AJP 如果您正在编写干净的代码,那么您永远不会编写可变大小写格式化程序。你会为上写一个类,为下写一个类,并完全避免讨厌的布尔参数。
@AJP 如果你直接调用upperCaseFormatter
,接口是无关紧要的。
有没有更好的语法来为对象方法提供这样的函数接口?例如。 打字稿中的泛型函数找不到接口属性
】打字稿中的泛型函数找不到接口属性【英文标题】:Genericsfunctionintypescriptcan\'tfindinterfaceproperty【发布时间】:2017-05-2913:26:33【问题描述】:我正在尝试使用泛型在打字稿中创建以下函数,但它向我显示以下错误:“\'CustomerInte... 查看详情
打字稿不会缩小函数构造函数
】打字稿不会缩小函数构造函数【英文标题】:Typescriptdoesn\'tnarrowonfunctionconstructor【发布时间】:2022-01-1517:24:25【问题描述】:我正在使用一个名为DNSHandler的构造函数,其接口如下所示:interfaceDNSHandlerreceived:Partial<DNSStandardQue... 查看详情
打字稿函数类型分配问题
】打字稿函数类型分配问题【英文标题】:Typescriptfunctiontypeassignmentissue【发布时间】:2018-10-1112:49:49【问题描述】:我正在尝试在我的应用程序中使用json-rpc-ws库,但我遇到了由库定义的处理程序函数签名问题。该库在声明文件... 查看详情
打字稿中的重载函数类型
】打字稿中的重载函数类型【英文标题】:Overloadedfunctiontypeintypescript【发布时间】:2019-02-0711:45:49【问题描述】:如何在不提供具体函数的情况下创建重载的函数类型?通过检查重载函数的类型,似乎可以在接口/对象类型上使... 查看详情
从类创建派生类型,但省略构造函数(打字稿)
】从类创建派生类型,但省略构造函数(打字稿)【英文标题】:Createaderivedtypefromclass,butomittheconstructor(typescript)【发布时间】:2020-02-2201:08:49【问题描述】:我有一个这样定义的接口和类:interfaceFooconstructor:typeofFoo;classFoostaticba... 查看详情
通用无状态组件 React 的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?
】通用无状态组件React的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?【英文标题】:TypeofGenericStatelessComponentReact?ORExtendinggenericfunctioninterfaceintypescripttohaveafurthergeneric?【发布时间】:2018-12-2919:04:20【问题描述】... 查看详情
打字稿界面上的可选参数?
】打字稿界面上的可选参数?【英文标题】:Optionalparametersontypescriptinterfaces?【发布时间】:2018-08-0505:30:26【问题描述】:作为explainedhere,?运算符可用于将函数参数标记为可选。?运算符对接口参数的含义是什么?例如,如果我... 查看详情
如何扩展递归打字稿接口?
】如何扩展递归打字稿接口?【英文标题】:Howtoextendarecursivetypescriptinterface?【发布时间】:2022-01-2006:25:26【问题描述】:我有一个递归接口,如下所示:interfaceTreeNodeid:stringchildren:TreeNode[]我想像这样扩展TreeNode:interfaceTreeNodeWit... 查看详情
打字稿从json创建一个类
】打字稿从json创建一个类【英文标题】:Typescriptcreateaclassfromjson【发布时间】:2016-03-0413:27:17【问题描述】:我有一个接口IPost和一个类Post,我想从json数据创建Post,在Post构造函数中我得到接口IPost匹配的json响应.我的意思是IPos... 查看详情
打字稿:无法声明接口
】打字稿:无法声明接口【英文标题】:typescript:cantdeclareaninterface【发布时间】:2021-02-0606:33:27【问题描述】:我正在使用typescript,但无法使用另一个文件中声明的接口。我的global.d.ts看起来像这样。declareinterfaceIPropSendEmailfrom:s... 查看详情
typescript打字稿接口继承(代码片段)
来自数组类型的打字稿接口
】来自数组类型的打字稿接口【英文标题】:Typescriptinterfacefromarraytype【发布时间】:2018-01-1808:20:01【问题描述】:我需要强制一个数组具有一组特定的值,这些值应该是我界面的键。我可以用强制数组typeSomeProperties=[\'prop1\',\'pr... 查看详情
useState 与接口 - 反应本机打字稿
】useState与接口-反应本机打字稿【英文标题】:useStatewithinterface-reactnativetypescript【发布时间】:2020-11-1820:43:58【问题描述】:有没有一种方法可以将useState与接口类型一起使用?这就是我正在尝试做的事情:const[movie,setMovie]=useSt... 查看详情
打字稿接口变量空检查并设置默认值
】打字稿接口变量空检查并设置默认值【英文标题】:typescriptinterfacevariablenullcheckandsetdefaultvalue【发布时间】:2021-02-1721:56:18【问题描述】:如何在接口变量上检查null以及如何在typescript中设置默认值?constuserModel=snap.data()asUserMo... 查看详情
再次:打字稿函数重载
】再次:打字稿函数重载【英文标题】:Onceagain:typescriptfunctionoverload【发布时间】:2019-07-0411:17:56【问题描述】:通常我可以掌握打字稿语言的大部分功能,但有时函数重载仍然相当具有挑战性。我无法理解为什么typescript编译... 查看详情
打字稿是不是允许接口和字符串联合类型?
】打字稿是不是允许接口和字符串联合类型?【英文标题】:Doestypescriptallowinterfaceandstringuniontypes?打字稿是否允许接口和字符串联合类型?【发布时间】:2018-12-0700:41:22【问题描述】:我正在尝试实现一个类似的方法,该方法采... 查看详情
打字稿 - 强制值成为接口的属性
】打字稿-强制值成为接口的属性【英文标题】:Typescript-forcevaluetobeaproprertyofaninterface【发布时间】:2021-12-0313:53:10【问题描述】:我正在尝试创建某种工厂来为discord.js发出的某些事件类型创建类。在此示例中,ClientEvents由discord... 查看详情
打字稿与实现接口一起扩展类
】打字稿与实现接口一起扩展类【英文标题】:typescriptextendsclassalongwithimplementinterface【发布时间】:2020-12-2522:13:36【问题描述】:我正在尝试扩展第三方库类mongooseJs,以便我可以在其中拥有一些自定义功能。我过去用Javascript做... 查看详情