【问题标题】:Generic constraint object with property string具有属性字符串的通用约束对象
【发布时间】:2022-01-09 11:58:27
【问题描述】:

我有一个通用函数,我只想要对象的属性字符串:

type StringProps<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];

public someFunction<T extends { [key in string]: string }>(list: T[], props: StringProps<T>[]): void {
  const foo: string[] = list.flatMap(item => props.map(prop => item[prop]));
}

当 T 是仅具有字符串类型属性的对象时,此方法有效。但是当对象有其他类型时它会失败。我可以将约束更改为:[key in string]: any,但我想尽可能避免使用任何(即使这里的任何都不重要。

简而言之:我如何创建一个约束来使用someFunction 与一个看起来像这样的对象:

{
  age?: number,
  name?: string,
}

【问题讨论】:

    标签: typescript generics constraints


    【解决方案1】:

    你快到了,你需要做的就是改变:

    // from
    function someFunction<T extends { [key in string]: string }>() {}
    
    // to:
    function someFunction<T extends { [key in string]: any }>() {}
    

    您可以将any 替换为您对对象形状的任何限制。

    这样做的原因是您告诉 typescript 通用 T 必须扩展 key: stringvalue: string ,仅此而已。因此,当你给它一个数字时,打字稿会给你一个错误,类似于 value: string is not assignable to value: string | number

    因此,只需将其从 value: string 更改为 any 或任何应该解决问题的约束即可。

    Playground

    【讨论】:

    • 谢谢,正如我上面提到的,我希望有一个没有任何解决方案的解决方案,但我认为那是不可能的。
    • 我的意思是,正如我所提到的,您不必输入any,您可以将其更改为您想要的任何内容。例如如果您只想要stringnumber,那么您可以使用string | number,但不幸的是您必须具体说明。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多