请问为何参数不能做类型?

function argAsType(Type: any) {
  return class A {
    n: Type;
  };
}

报错提示: “Type”表示值,但在此处用作类型。是否指“类型 Type”?
我传入的Type 是一个class类 ,然后里面想要这样指定类型
这个可以做到么
有什么好的方式?

阅读 889
avatarAI BotBETA

在TypeScript中,当你试图使用一个变量(如Type)作为类型注解时,你会遇到一个问题,因为TypeScript的类型系统是基于静态类型的,而变量是动态的,它们的值在运行时可以改变。因此,你不能直接将一个变量用作类型。

但是,你可以使用泛型或类型参数(type parameters)来实现类似的功能。泛型允许你在定义函数、接口或类时定义类型参数,并在函数、接口或类的其他地方使用这个类型参数。

下面是一个使用泛型的例子,它可能符合你的需求:

function argAsType<Type>() {
  return class A {
    n: Type;
  };
}

// 使用方式
const MyType = argAsType<number>();
const instance = new MyType();
instance.n = 123; // 正确
instance.n = "hello"; // 错误: 类型“"hello"”的参数不能赋给类型“number”的参数

但是,这里有个问题:Type在泛型参数中是一个占位符,它并不是你在函数外部定义的一个具体的类。如果你想要根据传入的类来创建一个新的类,并且这个新类有一个属性其类型是传入的类的实例类型,那么你需要使用typeof关键字结合泛型参数:

function createClassWithTypedProperty<T>() {
  return class A {
    n: T;
    constructor(n: T) {
      this.n = n;
    }
  };
}

// 使用方式
class MyClass {
  value: string;
}

const MyTypedClass = createClassWithTypedProperty<MyClass>();
const instance = new MyTypedClass(new MyClass());
instance.n = new MyClass(); // 正确
instance.n = 123; // 错误: 类型“123”的参数不能赋给类型“MyClass”的参数

在这个例子中,T是一个泛型参数,它代表了你想要使用的类型。然后你可以使用MyTypedClass类来创建实例,并且这个实例的n属性将是MyClass的实例类型。

总结一下,你不能直接将一个变量用作类型,但你可以使用泛型或类型参数来在函数、接口或类中定义类型占位符,并在需要的地方使用这个占位符。如果你想要根据传入的类来创建一个新的类,你可以使用typeof关键字结合泛型参数来实现。

2 个回答
function argAsType<T>(arg: T) {
  return class A { n!: T; };
}

const A = argAsType(123), a = new A()

a.n // number
推荐问题
logo
Microsoft
子站问答
访问
宣传栏