首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何接受一个类型参数,该参数只是一个接口,其中的方法返回承诺,拒绝不返回承诺的接口?

在TypeScript中,你可以使用泛型来接受一个类型参数,该参数是一个接口,其中的方法返回Promise,而拒绝不返回Promise的接口。以下是一个示例:

代码语言:txt
复制
interface PromisableFunction {
    <T>(arg: T): Promise<T>;
}

interface NonPromisableFunction {
    <T>(arg: T): T;
}

function handleFunction<T>(fn: PromisableFunction | NonPromisableFunction, arg: T): Promise<T> {
    return new Promise((resolve, reject) => {
        try {
            const result = fn(arg);
            if (result instanceof Promise) {
                result.then(resolve).catch(reject);
            } else {
                resolve(result as unknown as T); // 类型断言,确保返回值类型正确
            }
        } catch (error) {
            reject(error);
        }
    });
}

// 示例函数
const promisableFn: PromisableFunction = (arg) => Promise.resolve(arg);
const nonPromisableFn: NonPromisableFunction = (arg) => arg;

// 使用示例
handleFunction(promisableFn, 'test').then(console.log).catch(console.error); // 输出: test
handleFunction(nonPromisableFn, 'test').then(console.log).catch(console.error); // 输出: test

在这个示例中,我们定义了两个接口PromisableFunctionNonPromisableFunction,分别表示返回Promise和不返回Promise的函数。handleFunction函数接受一个泛型参数T和一个函数fn,这个函数可以是PromisableFunctionNonPromisableFunction类型。

handleFunction函数内部,我们首先尝试执行传入的函数fn,并检查其返回值是否为Promise实例。如果是Promise,我们使用.then().catch()方法处理成功和失败的情况。如果不是Promise,我们直接将其包装在一个Promise中并立即解决(resolve)。

这种方法允许你统一处理返回Promise和不返回Promise的函数,而不需要在调用时区分它们的类型。

参考链接:

  • TypeScript官方文档关于泛型
  • TypeScript官方文档关于Promise
相关搜索:如何实现一个可以接受任何参数的接口方法?如何将接口方法的返回类型定义为另一个接口?扩展和接口具有相同的方法,具有相同的参数,但返回类型不同在Haxe中,您是否可以编写一个泛型接口,其中方法类型参数由类的类型参数约束?在CanFly接口中,必须使用一个CanFly类型的参数声明速度方法如何记录/docstring一个参数/返回类型为动态的函数?如何使用一个函数的返回类型作为另一个函数的参数类型?如何创建一个具有char数组参数和char参数的方法,该方法查找数组中的特定字符并返回索引如何从节点js中的函数返回多个参数,一个作为接口,另一个作为变量如何从Roslyn的另一个方法中作为参数传递的方法中获取返回类型?返回类型,其中一个键是根据TypeScript 4.1中的参数计算得出的如何为返回带有最后一个参数可选新函数的函数设置正确的返回类型如何使用一个方法的返回值作为另一个方法中的参数?如何创建一个c#方法,它将返回与具有不同元素类型的参数相同的集合类型?如何知道具有类型接口的参数是否实际上是一个结构?如何将一个方法的返回值作为另一个方法的参数应用?在Java中,如何根据一个参数返回两种不同的类型?如何在验证框架的assert方法中接收一个方法返回的多个值作为参数?编写一个方法来对任何参数化类型的Set进行排序并返回一个TreeSet如何让一个函数在Javascript中接受不同类型的参数,并返回"dd.mm.yy“格式的日期?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一个如何实现两个接口中同名同参数不同返回函数

a); } 他们都要求实现方法GetA,而且传入参数都是一样String类型,只是返回一个是String一个是Int,现在我们要声明一个类X,这个类要同时实现这两个接口: public class... X:IA,IB 由于接口中要求方法方法名和参数是一样,所以不可能通过重载方式来解决,那么我们如何同时实现这两个接口拉?...解决办法是把其中不能重载方法直接写成接口方法,同时要注意这个方法只能由接口调用,不能声明为Public类型.所以X定义如下: public class X:IA,IB {     public...    {         Console.WriteLine("IB.GetA");         return 12;     } } 同样如果有更多同名同参不同返回接口,也可以通过"接口名....函数名"形式实现.

2.9K20
  • Effective C++笔记

    const可被施加于任何作用域内对象、函数参数、函数返回类型、成员函数本体 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上常量性” 当const和non-const...其中技术包括“来源对象”和“目标对象”地址、精心周到语句顺序以及copy-and-swap 确定任何函数如果操作一个以上对象,而其中多个对象是同一个对象时,其行为仍然正确 12....考虑写出一个不抛出异常swap函数 当std:swap对你类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常 如果你提供一个member swap,也提供一个non-member...为“异常安全”而努力是值得 异常安全函数提供一下三个保证之一 基本承诺:如果异常被抛出,程序内任何事物仍然保持在有效状态下 强烈保证:如果异常被抛出,程序状态不改变 不抛掷保证:承诺绝不抛出异常...需要类型转换时请为模板定义非成员函数 当我们编写一个class template,而它所提供“与此template相关”函数支持“所有参数隐式类型转换”时,请将那些函数定义为“class template

    81420

    JavaScript基础——Promise使用指南

    首先定义ajaxCallPromise返回类型为Promise,这意味我们会实现一个Promise承诺。...Promise接受两个函数参数,resolve(成功实现承诺)和reject(异常或失败) resolve和reject这两个特有的方法,会获取对应成功或失败值 如果接口请求一切正常,我们将会通过resolve...方法传入迭代Promise数组对象,并一起返回一个Promise对象,当所有的Promise迭代对象成功返回后,整个Promise才能返回成功状态值。...,在迭代数组中,只要任意一个进入失败状态,那么方法返回对象也会进入失败状态,并将那个进入失败状态错误信息作为自己错误信息,示例代码如下: const p1 = new Promise(function...,并等待其中一个进入完成或失败状态Promise对象,一旦有Promise对象满足,整个Promise对象将返回这个Promise对象成功状态或失败状态,下面的示例展示了返回一个成功状态值:

    97930

    蚂蚁区块链第7课 零知识证明隐私保护原理和蚂蚁BAAS接口调用实现

    如果a为0,则P = xG ,离散对数恰好是x,有人会为公钥签名。 把承诺当成公钥,对承诺哈希值签名,通过这种方法,某个佩德森承诺可以被证明是对0值承诺。...参数 必选 类型 说明 name 是 string 承诺类型,0 表示 input,1 表示 output【辉哥纠错】官网应写作,"OUT"表示输出,"IN"表示输入 index 是 uint 承诺索引...to 是 identity 承诺所属账户 value_enc 是 bytes 承诺数值 返回参数 必选 类型 说明 result 是 bool 方法返回值,成功为 true,否则为 false...函数原型 VerifyBalance(uint range) returns(bool); 请求参数 参数 必选 类型 说明 index 是 uint balance 验证索引 返回参数 必选 类型...是 int64 验证范围最小值 返回参数 必选 类型 说明 result 是 bool 方法返回值,成功为 true,否则为 false 4.3 Java SDK 隐私保护接口说明 Java

    1.9K30

    浅谈泛型

    泛型参数变量要么是T,要么至少以T开头,如TKey和TValue。大写T代表类型(Type)。 6. 很多方法接受Predicate类型参数,它是一个委托,类似:Func。...类型参数可以作为方法参数返回值或者方法内部定义局部变量类型使用。不仅如此,CLR还运行方法指定自己类型参数。这些类型参数也可作为参数返回值或局部变量类型使用。...相当于向编译器承诺一个指定类型实参实现了指定所有接口。...相当于向编译器承诺一个指定类型实参实现了公共无参数构造器。...如果允许将类型参数约束成具体类型,那么泛型方法会被约束为只支持具体类型,这还不如不要泛型呢!

    1K30

    Salesforce Javascript(一) Promise 浅谈

    上图我们可以经常用到,lwcwire adapter提供创建记录方法,我们可以看到return内容是一个Promise对象,而且文档中涉及到异步创建或者加载文档等方法通常说都返回一个Promise...我们对 Promise有了一个大概使用场景了解,那么 Promise如何声明如何使用呢,接下来慢慢展开。...它允许你为异步操作成功和失败分别绑定相应处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现结果promise对象。...Promise方法封装了一个 then方法,包括两个参数, onfulfilled以及onRejected,这两个参数都是函数类型,当 pending -> fulfilled ,会调用 onfulfilled...使用 Promise.all用来执行一组 Promise, loadScript / loadStyle是lwc封装好方法,用来执行 Promise并且返回类型也是 Promise。

    74720

    前端异步代码解决方案实践(二)

    言简意赅,但稍微聱牙诘屈,如何表述更浅显易懂呢? 说个故事, Promise 是一个美好承诺承诺本身会做出正确延时或异步操作。...next 方法 Generator.prototype.next() 返回一个包含属性 done 和 value 对象,也可以接受一个参数用以向生成器传值。...返回值对象包含 done 和 value 含义与迭代器章节一致,没有可过多说道。值得关注是,next() 方法可以接受一个参数,这个参数会替代生成器内部上条 yield 语句返回值。...类似于函数柯里化转换过程,把接受多个参数变换成只接受一个参数函数。...,我们约定 yield 关键字后表达式返回接受 callback 参数函数,即前面讲 Thunk 类型函数。

    3.3K60

    RxJS 快速入门

    (item)) 它会输出: 3 9 其中 of 称为创建器(creator),用来创建流,它返回一个 Observable 类型对象,filter 和 map 称为操作符(operator),用来对条目进行处理...它接收任意多个参数参数可以是任意类型,然后它会把这些参数逐个放入流中。 from - 数组转为流 ? 它接受一个数组型参数,数组中可以有任意数据,然后把数组每个元素逐个放入流中。...它接受两个数字型参数一个起点,一个终点,然后按 1 递增,把中间每个数字(含边界值)放入流中。...因此,当我们定义 defer 时候,实际上还不存在一个真正流,只是给出了创建这个流方法,所以叫惰性创建流。 timer - 定时器流 ?...当调用 Observable subscribe 方法时,会返回一个 Subscription 类型引用,它实际上是一个订阅凭证。

    1.9K20

    怎么理解JS Promise

    这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现结果promise对象 看完这段话我内心一阵无语,我就只能怪我自己理解能力好像没有达到水准一样,并不完全懂这段话在说什么...我们来看看MDN怎么说: onFulfilled 当Promise变成接受状态(fulfillment)时,参数作为回调函数被调用(参考: Function)。...该函数有一个参数,即接受最终结果(the fulfillment value)。...同样.catch()也有两种写法,只是.catch()只有一个参数而已。...事实上,Promise.then()方法返回值是一个promise对象,相同类型对象是可以链式调用。 我们继续那小花例子来说。

    11.7K30

    【笔记】《Effective C++》条款26-55

    在设计成员函数时候要小心不要创建了一些低封装性接口暴露了内部高封装成员, 例如一个public函数返回一个private成员引用就完全破坏了封装 解决方法是遇到这类需求时候, 给返回值加上const...::function可以将任何兼容于所需类型可调用对象(函数, 函数对象, 成员函数...)作为参数接受 我们还可以对这个函数对象设置默认参数令其使用默认行为 36 绝不重新定义继承而来non-virtual...这也是前面 条款7 和 条款34 一种解释 37 绝不重新定义继承而来缺省参数值 虚函数是动态绑定, 但是函数缺省参数值却是静态绑定, 只与你填写这个缺省参数值时类型有关, 与指针指向实际类型无关...称为成员函数模板(member function template) 智能指针类编写了非explicit构造函数, 在自身底层是T类型指针时, 接受一个U类型指针作为构造函数参数, 然后通过原始指针本身转换和继承形式将...52 写了placement new也要写placement delete new除了接受隐式传入size_t外, 还可以接受其它参数, 此时称为placement new, 最常用接受一个指针指向需要构造对象内存位置

    92830

    使用 promise 重构 Android 异步代码

    Promise 是 JavaScript 语言提供一种标准化异步管理方式,它总体思想是,需要进行 io、等待或者其它异步操作函数,不返回真实结果,而返回一个承诺”,函数调用方可以在合适时机...,选择等待这个承诺兑现(通过 Promise then 方法回调)。..., error); }); 实例化一个Promise对象,构造函数接受一个函数作为参数参数分别是resolve和reject。...这里由于我们Java版本Promise组件未开源,所以本部分只分析重构Case使用案例。 重构case1: 如何实现一个带超时网络接口请求?...Promise.any():接受任意个Promise对象,并发执行异步任务。等待其中一个成功即为成功,全部任务失败则进入错误状态,输出错误列表。

    27720

    掌握 Promise 逻辑方法

    , Promise.any 这些方法都可以接收一组承诺返回一个承诺 Promise.all(values) 其中参数 values 是一个可迭代对象,比如数组 在后文中使用词语“成功”表示承诺 resolve...,“失败”表示承诺 reject Promise.all Promise.all 方法返回承诺会等到参数中所有的承诺都成功之后才会成功,只要其中一个失败了则返回承诺也会立即失败,不会等到那些还挂起承诺有结果...,无论怎样方法返回承诺都不会失败 618467-20201205163301831-1282045813.png 和 Promise.all 方法区别 Promise.all 方法需要参数所有承诺都成功...}) 方法是 ES2020 新添加方法 Promise.any Promise.any 方法返回一组承诺中最快成功那个承诺,如果参数中所有承诺都失败了,那么返回承诺也失败 618467-20201205173032001...Promise.any 参数中一旦有一个承诺成功了返回承诺就会成功,Promise.all 参数中一旦有一个承诺失败了返回承诺就会失败 示例:同时加载一组图片,但是我们只需要用到其中一张,就可以用

    53710

    揭秘Java方法返回值,从void到诸多数据类型,有两下子!

    方法方法没有任何参数返回类型为void。...add方法接收两个int类型参数返回它们和;circleArea方法接收一个double类型参数返回半径为参数面积。...返回多态  Java中继承与多态概念可以拓展到方法返回类型。具体来说,如果一个方法返回类型是父类或接口类型,那么方法可以返回其子类或实现类对象。...根据参数值,返回一个Dog或Cat对象。接口定义 (interface Animal):定义了一个名为Animal接口,包含一个方法getName,方法用于返回动物名称。...代码作用  这段代码演示了如何在Java中使用接口和实现类来实现多态性。通过getAnimal方法,可以根据传入类型参数返回不同类对象,而这些对象都实现了同一个接口Animal。

    43641

    ES6 Promise详解之缝合红宝书ES6标准入门

    then方法一个参数是Resolved状态回调函数,第二个参数(可选)是Reject状态回调函数。 then方法返回一个Promise实例(注意!...var p = Promise.all([p1,p2,p3]); 上面代码中,Promise.all 方法接受一个数组作为参数,p1、p2、p3 都是 Promise 对象实例。...(Promise.all 方法参数不一定是数组,但是必须具有 iterator 接口,且返回每个成员都是 Promise 实例。) p 状态由 p1、p2、p3 决定,分成两种情况。...如果 Promise.resolve 方法参数,不是具有 then 方法对象(又称 thenable 对象),则返回一个 Promise 对象,且它状态为fulfilled。...Promise实例,实例状态为rejected。

    64530
    领券