首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在每个项目的键之间具有相同的泛型类型的类型

在每个项目的键之间具有相同的泛型类型的类型
EN

Stack Overflow用户
提问于 2019-10-23 17:36:06
回答 6查看 364关注 0票数 3

我想编写一个类型记录函数,它接受这样的参数:

代码语言:javascript
复制
myFunc([
  {
    initialValue: 6, // number
    finalValue: 8    // number
  },
  {
    initialValue: 'hello', // string
    finalValue: 'goodbye'  // string
  }
])

但如果考虑到这一点,就会失败:

代码语言:javascript
复制
myFunc([
  {
    initialValue: 6, // number
    finalValue: 'goodbye' // should fail because not a number!
  }
])

它感觉这个解决方案应该包含泛型,但是在每个数组项中是泛型的,而不是整个数组中的泛型。

编辑:我想要一个解决方案,它可以处理任何类型的值,而不仅仅是字符串或整数。我可能也需要将它用于类/函数。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-10-23 18:01:23

您可以使用泛型和映射类型获得这样的结果。我们将使用类型参数来捕获参数的实际类型(不管是什么,即使is确实包含无效的初始/最终对)。然后,我们将此类型转换为一个新类型,其中finalValue是根据传入的实际initialValue输入的。我们将这个新类型与参数类型中的交集一起使用。这将意味着将参数的类型推断为类型参数,但对照转换后的类型进行检查:

代码语言:javascript
复制
type FinalValues<T extends Array<{ initialValue: any }>> = {
    [P in keyof T]: T[P] extends { initialValue: infer I } ? { initialValue: I, finalValue: I }: never 
}

function myFunc<T extends [{ initialValue: any }] | Array<{ initialValue: any }>>(v: T & FinalValues<T>): FinalValues<T> {

}

myFunc([
  {
    initialValue: 6, // number
    finalValue: 8    // number
  },
  {
    initialValue: 'hello', // string
    finalValue: 'goodbye'  // string
  }
])

myFunc([
  {
    initialValue: 6, // number
    finalValue: "string"    // err
  },
  {
    initialValue: 'hello', // string
    finalValue: 1  // err
  }
])

您还可以更有创造性地添加一种自定义错误,以便这些错误更易读:

票数 3
EN

Stack Overflow用户

发布于 2019-10-23 22:15:38

解决方案是将列表元素类型定义为成员或两个字符串或两个数字的和类型。

代码语言:javascript
复制
type A = {
  initialValue: number
  finalValue: number
}
type B = {
  initialValue: string
  finalValue: string
}

type ListAB = (A | B) [] // type contains or A(two numbers) or B(two strings)

现在,具有ListAB类型的数组严格由Sum A | B输入。示例用法:

代码语言:javascript
复制
function myFunc(list: ListAB) {
  // implementation
}

// correct
myFunc([
  {
    initialValue: 6, // number
    finalValue: 8    // number
  },
  {
    initialValue: 'hello', // string
    finalValue: 'goodbye'  // string
  }
])

// will have error
myFunc([
  {
    initialValue: 6, // number
    finalValue: 'a'    // string
  },
  {
    initialValue: 1, // number
    finalValue: 'goodbye'  // string
  }
])
票数 1
EN

Stack Overflow用户

发布于 2019-10-23 17:56:29

也许你可以试试下面这样的方法。我不能百分之百确定它是否正确,但是它适用于上面提到的场景。

代码语言:javascript
复制
interface type1 {
    arg1: Array<string>,
    arg2: Array<string>
}

interface type2 {
    arg1: Array<number>,
    arg2: Array<number>
}

var t = function Test(arg: type1 | type2) {
    alert(arg.arg1);
    alert(arg.arg2);
}

var arg = { arg1: [2], arg2: [1]};
t(arg);

告诉我你的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58528248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档