目前,我的类型定义为:
interface Param {
title: string;
callback: any;
}
我需要类似的东西:
interface Param {
title: string;
callback: function;
}
但第二个不被接受。
目前,我的类型定义为:
interface Param {
title: string;
callback: any;
}
我需要类似的东西:
interface Param {
title: string;
callback: function;
}
但第二个不被接受。
Answers:
v1.4中的Typescript具有type
用于声明类型别名的关键字(类似于typedef
C / C ++中的a)。您可以这样声明您的回调类型:
type CallbackFunction = () => void;
该函数声明一个不带参数且不返回任何值的函数。接受零个或多个任何类型的参数且不返回任何值的函数将是:
type CallbackFunctionVariadic = (...args: any[]) => void;
然后您可以说,例如
let callback: CallbackFunctionVariadic = function(...args: any[]) {
// do some stuff
};
如果您想要一个函数,它接受任意数量的参数并返回任何值(包括void):
type CallbackFunctionVariadicAnyReturn = (...args: any[]) => any;
您可以指定一些强制性参数,然后指定一组其他参数(例如,字符串,数字,然后是一组额外的args),从而:
type CallbackFunctionSomeVariadic =
(arg1: string, arg2: number, ...args: any[]) => void;
这对于诸如EventEmitter处理程序之类的东西可能很有用。
可以按这种方式随意键入函数,尽管如果尝试使用类型别名将所有内容都弄清楚,则可能会被带走并遇到组合问题。
Function
和(...args: any[]) => any
什么是首选?
...args: any[]
不是很有用
type CallbackFunctionSomeVariadic = (arg1: string, arg2: number, ...args: any[]) => void;
我在找什么,ty。
这是一个接受回调的函数的示例
const sqk = (x: number, callback: ((_: number) => number)): number => {
// callback will receive a number and expected to return a number
return callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
return x; // we must return a number here
});
如果您不关心回调的返回值(大多数人不知道如何以任何有效方式使用它们),则可以使用 void
const sqk = (x: number, callback: ((_: number) => void)): void => {
// callback will receive a number, we don't care what it returns
callback (x * x);
}
// here our callback will receive a number
sqk(5, function(x) {
console.log(x); // 25
// void
});
注意,我用于callback
参数的签名...
const sqk = (x: number, callback: ((_: number) => number)): number
我会说这是TypeScript的缺陷,因为我们希望为回调参数提供一个名称。在这种情况下,我使用了_
它,因为它在sqk
函数内部不可用。
但是,如果您这样做
// danger!! don't do this
const sqk = (x: number, callback: ((number) => number)): number
它是有效的 TypeScript,但将被解释为...
// watch out! typescript will think it means ...
const sqk = (x: number, callback: ((number: any) => number)): number
即,TypeScript会认为参数名称为number
,而隐含类型为any
。这显然不是我们想要的,但是,a,TypeScript是这样工作的。
因此,在键入函数参数时,请不要忘记提供参数名称……看起来很愚蠢。
您可以通过多种方式在接口中定义函数类型,
export interface IParam {
title: string;
callback(arg1: number, arg2: number): number;
}
export interface IParam {
title: string;
callback: (arg1: number, arg2: number) => number;
}
type MyFnType = (arg1: number, arg2: number) => number;
export interface IParam {
title: string;
callback: MyFnType;
}
使用非常简单
function callingFn(paramInfo: IParam):number {
let needToCall = true;
let result = 0;
if(needToCall){
result = paramInfo.callback(1,2);
}
return result;
}
export interface IParam{
title: string;
callback(lateCallFn?:
(arg1:number,arg2:number)=>number):number;
}
共有四种抽象函数类型,当您知道函数将使用或不使用参数,是否将返回数据时,可以分别使用它们。
export declare type fEmptyVoid = () => void;
export declare type fEmptyReturn = () => any;
export declare type fArgVoid = (...args: any[]) => void;
export declare type fArgReturn = (...args: any[]) => any;
像这样:
public isValid: fEmptyReturn = (): boolean => true;
public setStatus: fArgVoid = (status: boolean): void => this.status = status;
对于仅将一种类型用作任何函数类型,我们可以将所有抽象类型组合在一起,如下所示:
export declare type fFunction = fEmptyVoid | fEmptyReturn | fArgVoid | fArgReturn;
然后像这样使用它:
public isValid: fFunction = (): boolean => true;
public setStatus: fFunction = (status: boolean): void => this.status = status;
在上面的示例中,一切都是正确的。但是从大多数代码编辑器的角度来看,下面的用法示例是不正确的。
// you can call this function with any type of function as argument
public callArgument(callback: fFunction) {
// but you will get editor error if call callback argument like this
callback();
}
正确要求编辑者是这样的:
public callArgument(callback: fFunction) {
// pay attention in this part, for fix editor(s) error
(callback as fFunction)();
}
Typescript:如何为方法参数中使用的函数回调定义类型?
您可以将回调声明为1)函数属性或2)方法:
interface ParamFnProp {
callback: (a: Animal) => void; // function property
}
interface ParamMethod {
callback(a: Animal): void; // method
}
自TS 2.6起存在重要的输入区别:
声明函数属性后,您将在--strict
或--strictFunctionTypes
模式下获得更强的(“声音”)类型。让我们举个例子:
const animalCallback = (a: Animal): void => { } // Animal is the base type for Dog
const dogCallback = (d: Dog): void => { }
// function property variant
const param11: ParamFnProp = { callback: dogCallback } // error: not assignable
const param12: ParamFnProp = { callback: animalCallback } // works
// method variant
const param2: ParamMethod = { callback: dogCallback } // now it works again ...
从技术上讲,方法是双变量和函数属性逆变下他们的观点strictFunctionTypes
。与内置类型结合使用时,仍会对方法进行更宽松的检查(即使没有声音),以使其更加实用。Array
。