按字符串数组选择类型

Pick type by array of string

我有类型

type User = {
    firstName: string,
    lastName: string,
    age: string
}

我需要一个函数

const result =  fun<User>(['firstName', 'lastName'])

我需要 result 类型是 User,选择了 firstNamelastName。是否可以使用 typeScript?

我认为 Typescript utility type 可以帮助你,特别是 Pick 实用程序类型

type User = {
    firstName: string,
    lastName: string,
    age: string
}

type UserName = Pick<User, "firstName" | "lastName">;

const example: UserName = {
  firstName: "mo",
  lastName: "mo",
  age: "mo" // Typescript error
}

是的,这是可能的。我自己并没有想出这个解决方案,所以所有的功劳都归功于来自 github:

的“drop-george”
type User = {
    a: number;
    b: number;
    c: number;
}

type ElementType < T extends ReadonlyArray < unknown > > = T extends ReadonlyArray<
  infer ElementType
>
  ? ElementType
  : never

function get<T, K extends (keyof T)[]>(v: T, keys: K): Pick<T, ElementType<K>> {
    return v
}

const user: User = {a: 1, b: 2, c: 3}
const v = get(user, ['a', 'b'])
const {a, b, c} = v // ERROR
const {a: a2, b: b2} = v // OK
const {a: a3} = v // OK
get({a: 1, b: 2, c: 3} as User, ['a', 'b', 'otherKey']) // ERROR

Original source

UPD:您可以只使用 ElementType<K> 而不是 ElementType<typeof keys>

UPD2:据我所知,如果你想制作类似 fun<User>(['firstName', 'lastName']) 的东西,唯一的两种方法是:

  • 指定您需要的属性两次:
function get<T, K extends (keyof T)[]>(keys: K): Pick<T, ElementType<K>> {
    // return user
}

const user = get<User, ['firstName', 'lastName']>(['firstName', 'lastName'])
  • 或者制作一个函数 returns 另一个函数有点像这样:
function get<T>(): <K extends (keyof T)[]>(keys: K) => Pick<T, ElementType<K>> {
    return keys => {
        // return user from db
    }
}

const user = get<User>()(['firstName', 'lastName'])