如何根据类方法的返回类型声明参数类型?

扬特拉布

例如 :

    export const mock = <T>(provide, key: keyof T, value) => (){}
    class Service {
      do(): boolean {
        return true;
      }
    }
    // value have to be Boolean 
    mock<Service>(Service, "do", true)

value参数是T[key]函数的返回类型我想知道是否有可能以某种方式声明值的类型。

约瑟夫船长

这是我的解决方案:

/**
 * If T is a Class, return union string type of class methods
 */
type ClassType<T> = T extends { new(): infer R } ? keyof R : never

/**
 * Check if property is a function/method
 */
type AnyFunc = (...args: any[]) => any

export const mock = <P,>(provide: P, key: ClassType<P>, value: P extends { new(): infer R } ? R[keyof R] extends AnyFunc ? ReturnType<R[keyof R]> : never : never) => {}

class Service {
  do(): boolean {
    return true;
  }
}



const reuslt = mock<typeof Service>(Service, 'do', false) // ok
const reuslt2 = mock<typeof Service>(Service, 'foo', false) // error, expected do
const reuslt3 = mock<typeof Service>(Service, 'do', 42) // error, expected boolean

请记住,TS会以不同方式对待Service类型typeof Service

因为我不是解释大师,所以这里是您的示例:

const x: Service = {
  do: () => true
}

const y: typeof Service = class {
  do() {
    return true
  }
}

TypeScript类文档

更新句柄承诺

/**
 * If T is a Class, return union string type of class methods
 */
type ClassType<T> = T extends { new(): infer R } ? keyof R : never

/**
 * Check if property is a function/method
 */
type AnyFunc = (...args: any[]) => any

type PromiseReturnType<T> = T extends Promise<infer R> ? R : T

export const mock = <P,>(provide: P, key: ClassType<P>, value: P extends { new(): infer R } ? R[keyof R] extends AnyFunc ? PromiseReturnType<ReturnType<R[keyof R]>> : never : never) => { }

class Service {
  do() {
    return new Promise<number>(resolve => resolve(42))
  }
}


const reuslt = mock<typeof Service>(Service, 'do', false) // ok
const reuslt2 = mock<typeof Service>(Service, 'foo', false) // error, expected do
const reuslt3 = mock<typeof Service>(Service, 'do', Promise.resolve(42)) // error, expected number
const reuslt4 = mock<typeof Service>(Service, 'do', 42) // ok

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在方法声明而不是类中使用类型参数

如何根据类类型调用某些方法并返回某些对象

根据参数返回类型

TypeScript声明方法的返回类型是类或子类的实例类型

如何用每个对象的类的返回类型声明一个类型间方法?

此方法如何返回与声明不同的类型?

如何根据参数类型转换函数的返回类型?

Typescript:如何根据参数类型获取函数的返回类型?

mypy:如何在泛型类中声明返回 self 的方法的返回类型?

如何在Kotlin中使用返回带有类型参数的子类型的方法创建类?

TypeScript子类:如何设置父类中定义的方法的参数类型和返回类型

根据参数区分返回类型

TypeScript根据类型参数返回不同的类型

根据可变参数类型推断返回类型

类方法的返回类型

使用aspectJ根据调用方法的参数修改方法的返回类型

通用方法类型参数声明

如何获取模板参数方法的返回类型?

如何检查模板类方法的返回类型?

如何使用Scala反射查找返回类型参数的方法的类型?

根据Clojure中参数类型返回的规范方法

如何根据参数的类型实例化不同的类?

由类的方法返回类型参数化的方法

如何让打字稿根据参数返回正确的类型

Python输入,mypy根据类方法的返回类型推断返回类型

返回扩展类的类型给平台声明冲突

返回类构造函数的函数的类型声明

如何根据参数类型判断功能类型

如何检查方法的通用返回类型是否与通过参数传递的类匹配?