简体   繁体   English

Typescript:如何用布尔值或回调函数定义联合类型?

[英]Typescript: how do you define a union type with boolean or a callback function?

How do you set a union type for a callback function or boolean? 如何为回调函数或布尔值设置联合类型? I tried this, but I got: 我试过了,但是得到了:

export interface IActions {
  dragend?: ((m:any)=>void) | boolean;
  click?:  ((m:any)=>void) | boolean;
  dblclick?:  ((m:any)=>void) | boolean;
}


    // using the following type guard in code
    // also tried `this.setting.click instanceof Function`
    if (typeof this.setting.click != 'boolean'){
      this.setting.click(m);
    } else {
      // default action
    }

Error: 错误:

error TS2349: Cannot invoke an expression whose type lacks a call signature. 错误TS2349:无法调用类型缺少调用签名的表达式。 Type 'boolean | 输入'boolean | ((m: any) => void)' has no compatible call signatures. (((m:any)=> void)'没有兼容的呼叫签名。

You can use type guards to create if statements that automatically type variables for you. 您可以使用类型保护来创建if语句,该语句自动为您键入变量。

One way to write these guards would be: 编写这些保护措施的一种方法是:

(Forgive the naming ... I'm not feeling terribly creative today!) (原谅命名...我今天觉得自己没有创造力!)

type Action = (m: any) => void;
type ActionOrBoolean = Action | boolean;

function isActionOrBooleanAction(actionOrBoolean: ActionOrBoolean): actionOrBoolean is Action {
    return typeof actionOrBoolean != 'boolean';
}

function isActionOrBooleanBoolean(actionOrBoolean: ActionOrBoolean): actionOrBoolean is boolean {
    return typeof actionOrBoolean == 'boolean';
}

And they can be used like: 它们可以像这样使用:

let v3: ActionOrBoolean = (Math.random() > 0.5)
  ? (p1: any) => {}
  : true;

if(isActionOrBooleanBoolean(v3)) {
    v3 = false;
} else if(isActionOrBooleanAction(v3)) {
    v3("");
}

Finally, here's a jsFiddle showing it all working. 最后,这是一个jsFiddle,显示了所有工作原理

writeLine("v1: " + v1);
writeLine("v1 isActionOrBooleanAction: " + isActionOrBooleanAction(v1));
writeLine("v1 isActionOrBooleanBoolean: " + isActionOrBooleanBoolean(v1));

writeLine("v2: " + v2);
writeLine("v2 isActionOrBooleanAction: " + isActionOrBooleanAction(v2));
writeLine("v2 isActionOrBooleanBoolean: " + isActionOrBooleanBoolean(v2));

// Example
let v3: ActionOrBoolean = (Math.random() > 0.5)
  ? (p1: any) => {}
  : true;

if(isActionOrBooleanBoolean(v3)) {
    v3 = false;
} else if(isActionOrBooleanAction(v3)) {
    v3("");
}

Output: 输出:

v1: true v1:是

v1 isActionOrBooleanAction: false v1 isActionOrBooleanAction:否

v1 isActionOrBooleanBoolean: true v1 isActionOrBooleanBoolean:true

v2: function (p1) { } v2:功能(p1){}

v2 isActionOrBooleanAction: true v2 isActionOrBooleanAction:true

v2 isActionOrBooleanBoolean: false v2 isActionOrBooleanBoolean:false

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM