簡體   English   中英

如何在打字稿中展平泛型類型聲明?

[英]How to flatten the generic types declaration in typescript?

案件:

函數輸入嵌套的通用對象,並輸出平面對象,如下所示:

interface Deep<T> {
  p1: T;
  p2: T;
}

type Nested<T> = {
  [P in keyof T]: Deep<any>;
}

type Flat<T, ?> = {
  [P in keyof T]: T[P]?;
}

function flat<T extends Nested<T>>(input: T, p: keyof Deep<any>): Flat<T, ?> {
  const put: any = {}
  for (let k in input)
    put[k] = input[k][p]
}

const foo = flat({
  name: { p1: 'name', p2: 'name' },
  { fn: { p1: () => 0, p2: () => 1 }
})

在這種情況下,輸入是一個具有不同Deep類型的嵌套對象,我希望foo.name可以提示我foo.name的類型為stringfoo.fn的類型為() => number

我應該如何聲明Flat<T, ?>的類型?

我不得不修改你的類型和代碼並猜測你正在嘗試做什么,但看起來這是一個你希望從映射類型推斷的例子。 而不是試圖描述一個類型函數Flat<> ,它接受輸入Nested<?>並展平它以產生輸出類型,反之亦然:將T視為展平輸出類型,將Nested<T>視為類型輸入:

// this is the same
interface Deep<T> {
  p1: T;
  p2: T;
}

// changed: for every property of T with key P and value of type T[P],
// there is a property of Nested<T> with key P and value of type Deep<T[P]>
type Nested<T> = {
  [P in keyof T]: Deep<T[P]>;
}

// output is T, input is Nested<T> and a key of Deep<>
function flat<T>(input: Nested<T>, p: keyof Deep<any>): T {
  const put = {} as T; // assert as type T
  for (let k in input)
    put[k] = input[k][p];
  return put; // added return value
}

我們可以按照您想要的方式使用它:

const foo = flat({
  name: { p1: 'name', p2: 'name' },
  fn: { p1: () => 0, p2: () => 1 },
}, 'p2'); // example code lacked 'p1' or 'p2' argument

foo.name.charAt(0); // works
foo.fn().toFixed(0); // works

希望有所幫助; 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM