拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 基于阵列自变量的Typescript动态物件回传型别

基于阵列自变量的Typescript动态物件回传型别

白鹭 - 2022-01-23 2085 0 0

通过以下抽象,我可以呼叫此方法,并且回传型别基于我传递给它的基于字符串的栏位,如下所示。

abstract class Entity {
  abstract id: string
}

class User extends Entity {
  constructor(obj: Partial<User>) {
    super()
    Object.assign(this, obj)
  }

  id: string
  name: string
  age: number
}

class Post extends Entity {
  constructor(obj: Partial<Post>) {
    super()
    Object.assign(this, obj)
  }

  id: string
  content: string
  time: Date
}


export const useSyncFields = <T extends Entity, U extends (keyof T & string)[]>(
  type: { new(obj: T): T },
  id: string,
  fields: U,
): { [K in U[number]]: T[K] } => {
   ...
}

const user1: {id: string, name: string} = useSyncFields(User, "1234", ["id", "name"])
const user2: {id: string, age: number} = useSyncFields(User, "1234", ["id", "age"])
const post: {content: string} = useSyncField(Post, "4567", ["content"]
// etc

通过使用型别自变量<T extends Entity, U extends (keyof T & string)[]和回传型别{ [K in U[number]]: T[K] },从 Typescript 推断的回传型别“正确”,但是 VSCode 或 WebStorm 在正确推断型别方面做得很好。

我觉得有一组更好的型别自变量/回传型别可以更好地推断。我在这里能做的真的是最好的吗?还是有一些型别的忍者可以指导我找到更好的解决方案?

uj5u.com热心网友回复:

如果您只是想让这更简单,我会选择:

export const useSyncFields = <T extends Entity, U extends keyof T>(
  type: { new(obj: T): T },
  id: string,
  fields: U[],
): Pick<T, U> => {
   return {} as any // implementation
}

如果您不关心型别中阵列的长度或顺序,那么您不需要对整个阵列进行通用。所以这只是对fields阵列成员的通用这意味着您不必去钓鱼U[number]即可获得密钥的联合。

它还采用Pick实用型,节省您不必复杂找映射回传型别。

操场

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *