Typescript定义函数,根据参数类获取实例?

问题描述 投票:0回答:1
  1. A基类。
class A {}
  1. B、C扩展为A
class B extends A {}

class C extends A {}
  1. 使用函数创建实例。
namespace D {
  function NewInstance<T extends A = A>(iclass: T): T;
}

想要:删除 <T extends A> 并根据输入类自动确定返回类型。

D.NewInstance(B) => B, D.NewInstance(C) => C

目前。如果我不设置通用。D.NewInstance(B) => A, D.NewInstance(C) => A

typescript definition
1个回答
0
投票

去掉泛型函数声明中的默认类型,应该会让事情按照你的期望工作。

interface A { }
interface B extends A { }

function NewInstance<T extends A>(iclass: T): T { 
  return iclass
}

const a: A = {}
const b: B = {}

NewInstance(a) // return A
NewInstance(b) // return B

0
投票

谢谢@Karthick Vinod,但是我的函数的参数是一个类。

回答我自己的问题。关键是util类型 type Newable<T> = new (...args: any[]) => T;

abstract class A {
  a: number = 1;

  abstract aa(): void;
}

class B extends A {
  bb: number = 2;

  aa(): void {}
}

class C extends A {
  cc: number = 3;

  aa(): void {}
}

type Newable<T> = new (...args: any[]) => T;

function NewInstance<T extends A>(iclass: Newable<T>): T {
  return new iclass();
}

const a = NewInstance(A); // error, A is not newable

const b = NewInstance(B); // return B
console.log(b.a); // ok
console.log(b.bb); // ok
b.aa(); // ok

const c = NewInstance(C);
console.log(c.a);
console.log(c.cc);
c.aa();
© www.soinside.com 2019 - 2024. All rights reserved.