typescript 类型脚本引用对象的“this”类型

7cjasjjr  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(181)

考虑以下类型:

type UserList = {
  userIds: string[]
  userData: {
    [UserId in UserList['userIds'][number]]: {
      userId: UserId
      username: string
    }
  }
}

我想告诉TypeScript编译器两件事:

  1. userData密钥必须存在于userIds
  2. userId字段必须等于同一条目的键
    我觉得我需要某种thisself关键字,而不是UserList
bvjxkvbb

bvjxkvbb1#

我认为不使用泛型类型参数就不可能引用userIds中的确切字符串值:

type UserList<T extends ReadonlyArray<string>> = {
  userIds: T
  userData: {
    [UserId in T[number]]: {
      userId: UserId
      username: string
    }
  }
}

你的类型定义应该如下所示:

const a: UserList<['hello']> = {
    userIds: ['hello'],
    userData: {
        hello: {
            userId: 'hello',
            username: 'username'
        }
    }
}

如果不想指定两次用户ID(在泛型参数和实际UserList变量中),则可以使用have to use a wrapper function

function asUserList<T extends ReadonlyArray<string>>(list: UserList<T>) {
  return list;
}

const a = asUserList({
    userIds: ['hello'] as const,
    userData: {
        hello: {
            userId: 'hello',
            username: 'username'
        }
    }
})

如果你不使用泛型参数,而是尝试在接口中使用this类型,如下所示:

interface UserList {
  userIds: string[]
  userData: {
    [UserId in this['userIds'][number]]: {
      userId: UserId
      username: string
    }
  }
}

它不会起作用,因为this['userIds']总是解析为弱string[]类型,而不是允许您基于userIds的确切值来强类型化userData的特定字符串集。

相关问题