当前位置: 首页 > 知识库问答 >
问题:

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

游鸣
2024-07-03
function argAsType(Type: any) {
  return class A {
    n: Type;
  };
}

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

共有4个答案

范稳
2024-07-03

也许你想要搜索的是 泛型 <T>?

如果在学习 TS 的话,可以考虑一下通过这个项目来学习 �� type-challenges: Collection of TypeScript type challenges with online judge

谷梁德容
2024-07-03

可以这样试试

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

    constructor(n: T) {
      this.n = n
    }
  };
}

argAsType<number>(1) // 指定为数字
argAsType<string>('1') // 指定为字符串
孔鹤龄
2024-07-03
function argAsType<T>(arg: T) {
  return class A { n!: T; };
}

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

a.n // number
南门向荣
2024-07-03

在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关键字结合泛型参数来实现。

 类似资料:
  • 本文向大家介绍不能做switch()的参数类型是:相关面试题,主要包含被问及不能做switch()的参数类型是:时的应答技巧和注意事项,需要的朋友参考一下 switch 的参数不能为实型。    

  • 请问,为何不能这样运行ts文件呢? 文件util.ts: 文件:__test__/util.test.ts 然后我在执行: 的时候,报错: 请问,这个报错的原因是什么呢? 我已经在 文件:__test__/util.test.ts 添加了导出啊:

  • class类可以完成的事情,我们使用普通的function以及变量定义也能完成,所以很多情况下,我们都是使用后者来完成业务,class用的地方不多,但class有它自己的属性、方法,可以加默认值,它也可以继承,在项目中,有哪些地方是我们可以合理利用class方法的?class主要是用来干什么的?

  • 您好,请问下,我有一个字符串,如何用这个字符串作为JSX来使用呢? 请问如何基于str这个字符串变量做到<AppComp/>? 更新1 因为其他地方已经定义了AppComp,所以直接引入,但是在这进行字符串创建JSX名称使用。

  • html请求代码是这样的,用post请求,键的名字叫name controller的代码是这样的,因为是传json,我有加@RequestBody 实体类的代码,也是取name,getter setter也有实现

  • 定义参数化类时,只能使用固定数量的参数。 但是,如果你想创建一个包含多个值的地图。必须使用映射

  • 我刚刚更新到Dart2和Flatter sdk:' 无法将参数类型“Object”指定给参数类型“ImageProvider”。), 我只是从弗利特开始,不知道该去哪里找别的。

  • 由于最近的更新,我正面临这个问题,请伙计们帮帮我