【问题标题】:How to generically type an object in Typescript如何在 Typescript 中通用地键入对象
【发布时间】:2021-06-10 18:25:18
【问题描述】:

我有一个设置对象,想为这样的函数提供单个键值对:

const settings = {
  time1: 40 * 60 * 60,
  time2: 10 * 60 * 60,
  breaks: [
    { limit: 6 * 60 * 60, length: 30 * 60 },
    { limit: 9 * 60 * 60, length: 15 * 60 },
  ],
}

// works
function changeSetting1<T extends keyof typeof settings>(details: {key: T, value: typeof settings[T]}): void {
//
}

// doesn't work
type func_details = <T extends keyof typeof settings>{key: T, value: typeof settings[T]}
function changeSetting2(details: func_details): void {

changeSetting1({key: "time1", value: 8 * 60 * 60})
changeSetting2({key: "time1", value: 8 * 60 * 60})

虽然当我直接在函数中键入时它似乎可以工作,但 TypeScript 抱怨说,当我第一次定义类型 func_details 时预期会有一个 (。这样做的正确语法是什么?

TS Playground

【问题讨论】:

    标签: typescript


    【解决方案1】:

    首先,你有一个语法错误。类型定义应该是:

    type func_details<T extends keyof typeof settings> = {key: T, value: typeof settings[T]};
    

    其次,由于函数接受具有泛型类型的参数,因此函数本身必须具有满足extends keyof typeof settings条件的泛型参数。

    function changeSetting2<T extends keyof typeof settings>(details: func_details<T>): void {
      // [...]
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2018-10-15
      • 2021-11-09
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多