function argAsType(Type: any) {
return class A {
n: Type;
};
}
报错提示: “Type”表示值,但在此处用作类型。是否指“类型 Type”?
我传入的Type 是一个class类 ,然后里面想要这样指定类型
这个可以做到么
有什么好的方式?
function argAsType(Type: any) {
return class A {
n: Type;
};
}
报错提示: “Type”表示值,但在此处用作类型。是否指“类型 Type”?
我传入的Type 是一个class类 ,然后里面想要这样指定类型
这个可以做到么
有什么好的方式?
在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
关键字结合泛型参数来实现。
function argAsType<T>(arg: T) {
return class A { n!: T; };
}
const A = argAsType(123), a = new A()
a.n // number
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
8 回答3.7k 阅读
3 回答2.5k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
也许你想要搜索的是 泛型 <T>?
如果在学习 TS 的话,可以考虑一下通过这个项目来学习 👉 type-challenges: Collection of TypeScript type challenges with online judge