【问题标题】:Typescript: Define type which holds functions for every key another type打字稿:定义类型,该类型为另一种类型的每个键保存功能
【发布时间】:2021-11-19 19:14:15
【问题描述】:

我需要定义两种类型:

  1. 对象的类型,其中包含一些具有已定义类型值的数据
  2. 对象的类型,其中包含第一种类型的对象中包含的值的验证器

我的体会:

type Data = Record<string, string|number|Array<string>>
type Validators<T extends Data> = {
  [P in keyof T]?: (value: T[P]) => string
}

interface MyData extends Data {
  first: string,
  second: number,
  third: Array<string>,
}

const validators: Validators<MyData> = {
  first: (value: string) => "",
};

有了这个认识,我得到了验证器对象的错误:

TS2322: 输入'{ first: (value: string) => string; }' 不可分配给类型 'Validators'。 属性 'first' 与索引签名不兼容。 类型 '(value: string) => string' 不可分配给类型 '(value: string | number | string[]) => string'。 参数 'value' 和 'value' 的类型不兼容。 键入'字符串 |号码 | string[]' 不可分配给类型 'string'。 类型“数字”不可分配给类型“字符串”。

是否可以在 typescript 中定义此类类型?

【问题讨论】:

  • this code 是否满足您的需求?你不能真正使用索引签名,因为如果我写了一个答案,我可以理解。如果它不能满足您的需求,请edit您的示例代码来说明您的问题所在。

标签: typescript


【解决方案1】:

是否可以在 typescript 中定义此类类型?

是的。问题是通过扩展DataMyData 现在有一个返回string | number | Array&lt;string&gt; 的字符串索引:

// as if you had written this
interface MyData {
  first: string,
  second: number,
  third: Array<string>,
  [k: string]: string | number | Array<string>
}

在构建验证器时,first 键与您的 first 键和您的 string 索引匹配。

因此,typescript 需要一个匹配 (value: string) =&gt; string 的函数,但也匹配 (value: string | number | Array&lt;string&gt;) =&gt; string

由于您提供的函数只接受 string 作为参数,因此编译会中断。

如果要将string | number | Array&lt;string&gt;的类型限制应用于使用Validators的接口,则不应使用字符串索引,而应使用仅使用子类型键的索引:

type Data<Subtype> = Record<keyof Subtype, string | number | Array<string>>
type Validators<Subtype extends Data<Subtype>> = {
    [P in keyof Subtype]?: (value: Subtype[P]) => string
}

interface MyData {
    first: string
    second: number
    third: Array<string>
}

const validators: Validators<MyData> = {
    first: (value: string) => "",
};

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 2021-04-18
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2019-04-10
    • 2021-08-23
    相关资源
    最近更新 更多