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

javascript - 第22行的data怎么动态推断出与payload.data的类型一致?

马冯浩
2024-08-30

第22行的data怎么动态推断出与payload.data的类型一致?

第22行的data怎么动态推断出与payload.data的类型一致?

共有3个答案

唐阳飇
2024-08-30
export class ResultData<T = any> {
  message?: string;
  data?: T;
  success!: boolean;
  constructor(event: any, params: ResultData & { status: number }) {
    console.log(event);
    const { status, ...rest } = params;
    Object.assign(this, rest);
  }

  static OK<T>(event: string, params: Partial<ResultData<T>> & { status: number }) {
    return new ResultData<T>(event, { ...params, success: true });
  }
}

function promise(): Promise<{ id: number, name: string }> {
  return new Promise((resolve) => {
    resolve({ id: 1, name: 'zsh' })
  })
}

async function result() {
  const name = await promise();
  const result = ResultData.OK('', {
    status: 200,
    data: {
      id: 1,
      name: 'zsh'
    }
  })
  const data = result.data?.id!; // number
}

泛型符合你的预期吗?

燕嘉熙
2024-08-30

如果你想要在运行时进行类型验证,可以使用 Zod

如果你仅是需要类型提示和代码补全,参考 @寸寸青丝愁华年 的回答使用泛型。

连德水
2024-08-30

在大多数静态类型语言(如TypeScript)中,如果你希望一个变量(如data)能够动态地推断出与另一个变量(如payload.data)相同的类型,你通常需要使用一些类型系统提供的功能或技巧。然而,直接“动态推断”类型在编译时是行不通的,因为类型信息是在编译时确定的,而“动态”通常指的是运行时行为。

不过,有几种方法可以在TypeScript(或类似支持类型推断的语言)中接近这种效果:

  1. 类型断言(Type Assertions):
    如果你确信datapayload.data在运行时具有相同的类型,你可以使用类型断言来告诉TypeScript编译器datapayload.data的类型。例如:

    let data: any = payload.data; // 假设这里先使用any作为类型
    const dataTyped = data as typeof payload.data; // 类型断言

    但注意,typeof payload.data在TypeScript中并不是这样使用的,因为typeof运算符在TypeScript中返回的是类型本身(如stringnumber等),而不是变量值的类型。所以上面的代码仅作示例,实际上并不工作。

  2. 泛型(Generics):
    如果payload来自一个泛型函数或类,并且其data属性被正确地类型化,那么你可以通过泛型来确保data具有相同的类型。

    interface Payload<T> {
      data: T;
    }
    
    function processData<T>(payload: Payload<T>) {
      let data: T = payload.data; // 这里data的类型自动与payload.data相同
      // 使用data...
    }
  3. 条件类型(Conditional Types)和映射类型(Mapped Types):
    对于更复杂的类型推断,你可能需要使用条件类型或映射类型来根据payload.data的类型来推断data的类型。但这通常用于更高级的场景,比如类型映射或类型转换。
  4. 接口继承类型别名
    如果你知道payload的结构并且想复用这些类型信息,你可以通过定义接口或类型别名来继承这些类型。

    interface BaseData {
      // 定义一些共有属性
    }
    
    interface PayloadWithData<T extends BaseData> {
      data: T;
    }
    
    let payload: PayloadWithData<{ id: number, name: string }> = { data: { id: 1, name: "Example" } };
    let data: typeof payload.data = payload.data; // 这里typeof用于示例,实际不需要

在实际应用中,通常推荐使用泛型来处理这种情况,因为它提供了类型安全性和灵活性。如果你确实需要在运行时处理类型,并且需要动态地根据payload.data的类型来更改data的类型,那么你可能需要考虑使用运行时类型检查(如instanceof或自定义类型检查函数)结合类型断言。但请注意,这将牺牲一些TypeScript提供的编译时类型安全性。

 类似资料:
  • 我正在尝试获取部分应用的函数的列表,如下所示: 编译器向我产生一个错误: 错误[E0277]:类型std::vec::Vec的值 随后的尝试也没有成功: 1. 也只有这一次尝试最终成功了! 为什么在动态闭包方面类型推断如此糟糕? 为什么在第一次尝试中不起作用? 有没有更好的方法来利用类型推理来表达这样的想法?

  • 从JEP 286中,我们可以在JDK 10(18.3)中利用本地类型推断()。JEP声明将进行以下编译,这是预期的: 谢谢!

  • 问题内容: 我尝试扫描有关本地类型推断的JEP-286。我看到这仅适用于局部变量- 了解。因此这确实有效: 我确实看到,另一方面,它无法编译: 很明显,事实并非如此,因为JEP是这样说的。现在我的问题是: 对于宣布失败的 公共/受保护 成员,至少是IMO,这是完全合理的。但是,为什么即使编译也不编译呢?我只能假设您仍然可以通过反射保留该变量(而我无法获得这样的局部字段)…而且获取该变量可能需要强制

  • 主要内容:1 Java8 类型推断的介绍,2 Java8 类型推断的案例1,3 Java8 类型推断的案例21 Java8 类型推断的介绍 类型推断是Java的一项功能,它使编译器可以查看每个方法调用和相应的声明以确定参数的类型。 Java在Java 8中提供了类型推断的改进版本。 1.1 Java8以前 在下面的声明中,我们在一侧提到了arraylist的类型。这种方法是在Java 7中引入的。在这里,您可以将第二面留为<>,并且编译器将通过引用变量的类型来推断其类型。 1.2 Java8以后

  • TypeScript 类型检查机制包含三个部分: 类型推断 类型保护 类型兼容性 本节介绍其中的类型推断,类型推断主要用于那些没有明确指出类型的地方帮助确定和提供类型,这是 TypeScript 的一种能力。 类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同应用。 1. 慕课解释 类型推断的含义是不需要指定变量类型或函数的返回值类型,TypeScript 可以根据一些简单的规则推断其

  • 01 模板类型推断机制 auto 推断的基础是模板类型推断机制,但部分特殊情况下,模板推断机制不适用于 auto 模板的形式可以看成如下伪代码 template<typename T> void f(ParamType x); // ParamType 即 x 的类型 调用可看成 f(expr); 编译期间,编译器用 expr 推断 T 和 ParamType,实际上两者通常不一致,比如 te

  • C++98只有一种类型推导规则:函数模板。C++11修改了一点规则样本,并且添加额外的两条规则,一条是auto,另一个是decltype。C++14继续扩展了auto和decltype的使用情况。随着类型推导的广泛使用,会使得你从一些明显的或者是冗余的类型拼写中解放出来。它使得C++编写的软件更加具有适用性,因为改变代码中的一处地方的类型,编译器会在代码的其他地方自动的推导出类型定义。但是这使得代