typescript - 确定泛型方法类型的默认参数

标签 typescript generics default-arguments typescript-generics

我定义了一个泛型方法,其泛型类型由其中一个参数决定:

myMethod<T>(param1: number, param2: T): T {
  return param2;
}

现在,我想为参数设置一个默认值,然后 T 将由默认值的类型决定:

myMethod<T>(param1: number, param2: T = 'myDefaultString'): T {
  return param2;
}

但这不会编译,因为它期望“string”匹配 T 而不是确定 T 为“string”。

一个解决方案是这样写:

myMethod<T>(param1: number, param2: T = <any>'myDefaultString'): T {
  return param2;
}

但是我需要在调用站点明确指定类型:

const val: string = this.myMethod<string>();

我考虑的另一个解决方案是编写第二个函数,不带默认参数:

myMethod<T>(param1: number, param2: T): T {
  return param2;
}

myMethodDefault(param1: number): string {
  return myMethod(param1, 'myDefaultString');
}

但是我需要一个不同的名字,这让我很困扰。

有更好的方法吗?

最佳答案

类型部分可以使用默认泛型类型参数来实现(自 TypeScript 2.3 起):

class Hey {
    myMethod<T = string>(arg1: number, arg2?: T): T {
        if (arg2 === undefined)
            // have to handle default parameter manually
            return "myDefaultString" as any as T;
        return arg2;
    }
}

const h = new Hey();

// n1: string;
const n1 = h.myMethod(1);
// n2: typeof "mm"
const n2 = h.myMethod(2, "mm");
// n3: { a: number }
const n3 = h.myMethod(3, { a: 1 });

关于typescript - 确定泛型方法类型的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44802783/

相关文章:

scala - 依赖方法类型与默认参数冲突

typescript - Uncaught ReferenceError : firebase is not defined in Kotlin/JS project with Dukat generated declarations

angular - Ionic 框架使用文件 API 创建文件

javascript - 修改日期时出现问题(修改错误)

c# - 将对象列表转换为元组列表而不进行迭代

python - 父级与子级具有不同的变量名称

ReactJS:具有定义为数组但被视为对象的 Prop 的功能组件

.net - 如何从 wcf 服务中检索未知类型?

Java泛型和 "Bound mismatch"

c++ - 具有默认参数的成员初始化列表