gpt4 book ai didi

javascript - Typescript:如何使用 bool 值或回调函数定义联合类型?

转载 作者:行者123 更新时间:2023-12-03 00:56:08 26 4
gpt4 key购买 nike

如何为回调函数或 bool 值设置联合类型?我尝试了这个,但我得到了:

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 TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'boolean | ((m: any) => void)' has no compatible call signatures.

最佳答案

您可以使用type guards创建自动为您键入变量的 if 语句。

编写这些防护的一种方法是:

(请原谅这个命名......我今天感觉不太有创意!)

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';
}

它们的用法如下:

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

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

最后,这是一个 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("");
}

输出:

v1: true

v1 isActionOrBooleanAction: false

v1 isActionOrBooleanBoolean: true

v2: function (p1) { }

v2 isActionOrBooleanAction: true

v2 isActionOrBooleanBoolean: false

关于javascript - Typescript:如何使用 bool 值或回调函数定义联合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52832363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com