提取打字稿中的通用参数

骗子

我有一个简单的IFactory<OUT>界面和两个派生类。

export interface IFactory<OUT = any> {
    create(): OUT;
}

// number implementation
export class NumberFactory implements IFactory<number> { ... }

// string implementation
export class StringFactory implements IFactory<string> { ... }

还有一种calculate()使用给定模型构建对象的方法。

对于以下模型;

const model: Record<string, IFactory> = {
    num: new NumberFactory(),
    str: new StringFactory()
}

calculate()方法返回一个类似于下面的对象;


const result = calculate(model);

/// result
/// {
///    num: 1,
///    str: "str"
/// }

问题是,我怎么知道结果的类型?我尝试内置打字机实用程序,但无法实现。

谢谢您的帮助。

贾卡尔兹

如果您将注释 modelRecord<string, IFactory>,那么您已经迷路了。这导致编译器忘记了其中的任何特定键-值关系model,而是将其一直扩展到具有任何可能的键且其属性为任何可能的IFactory类型的事物如果您想从中添加/修改/删除属性,那就太好了model否则,您可能应该让编译器为您推断类型model

const model = {
   num: new NumberFactory(),
   str: new StringFactory()
}

/* const model: {
    num: NumberFactory;
    str: StringFactory;
} */

现在,您将有机会calculate()跟踪输入类型,以使输出达到您的期望。这是一种可能的实现:

function calculate<T extends object>(model: { [K in keyof T]: IFactory<T[K]> }) {
   return Object.fromEntries(
      Object.entries(
         model as Record<string, IFactory>
      ).map(([k, v]) => [k, v.create()])
   ) as T;
}

在这里,我使用来自映射类型的推论来查看calculate()某种对象类型的输出,T以及将输入作为映射版本的输入,其中每个属性T[K]都包裹在一起IFactory以产生IFactory<T[K]>

在函数体内,编译器无法真正跟踪或验证实现是否正确执行了此操作,因此我使用一些类型断言来告诉它不要担心。这给我增加了类型安全的负担,因此我必须小心。

让我们测试一下:

const result = calculate(model);
// const result: {
//    num: number;
//    str: string;
// }

console.log(result);
/// result
/// {
///    num: 1,
///    str: "str"
/// }

看起来不错。calculate()接受model并推断T{num: number; str: string;},实现也可以在运行时运行。

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通用咖喱函数的打字稿打字

来自分类Dev

如何在打字稿中定义匿名通用接口?

来自分类Dev

什么是打字稿中的打字?

来自分类Dev

打字稿:从方法参数中调用方法

来自分类Dev

打字稿:通用函数类型转换所有函数参数

来自分类Dev

打字稿-声明通用方法

来自分类Dev

如何从打字稿中的JSON中提取特定值

来自分类Dev

打字稿使参数可选

来自分类Dev

打字稿-在函数的参数中添加一个参数

来自分类Dev

在打字稿中抽象出通用类型参数

来自分类Dev

如何在打字稿中定义通用接口

来自分类Dev

打字稿通用类型参数:T vs T扩展{}

来自分类Dev

从打字稿中的扩展类返回通用值

来自分类Dev

提取打字稿属性

来自分类Dev

“ Duck”打字与打字稿中的函数参数

来自分类Dev

如何从打字稿中的类中提取类型?

来自分类Dev

枚举作为打字稿中的通用类型

来自分类Dev

带有通用参数的打字稿中的工厂

来自分类Dev

通用咖喱函数的打字稿打字

来自分类Dev

打字稿中的条件类型参数

来自分类Dev

打字稿通用类型断言

来自分类Dev

基于打字稿中参数值的条件打字功能

来自分类Dev

如何在打字稿中定义匿名通用接口?

来自分类Dev

打字稿,自返回通用

来自分类Dev

打字稿创建通用对象

来自分类Dev

从打字稿中的通用类型调用通用类型的静态函数

来自分类Dev

通用api类型的打字稿?

来自分类Dev

通用方法的打字稿接口

来自分类Dev

打字稿函数参数