按字符串数组选择类型
Pick type by array of string
我有类型
type User = {
firstName: string,
lastName: string,
age: string
}
我需要一个函数
const result = fun<User>(['firstName', 'lastName'])
我需要 result
类型是 User
,选择了 firstName
和 lastName
。是否可以使用 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
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'])
我有类型
type User = {
firstName: string,
lastName: string,
age: string
}
我需要一个函数
const result = fun<User>(['firstName', 'lastName'])
我需要 result
类型是 User
,选择了 firstName
和 lastName
。是否可以使用 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
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'])