TypeScript:使接口字段成为必需字段,但仅限于数组类型

baubqpgj  于 2022-11-18  发布在  TypeScript
关注(0)|答案(2)|浏览(109)

是否可以将所有接口字段都设置为必填字段,但只设置为数组类型?Required运算符将所有字段设置为必填字段,但我只需要数组类型的字段???
`

interface IExample {
    a: number,
    b?: string,
    c?: number[]
}

function getTest(data: IExample): Required<IExample> {

    return {
        ...data,
        c: data.c ?? []
    }
}

//Error because the 'c' field is also checked, but it is not an array. How to check for arrays only?

`
先谢了
我假设这个问题可以用元组来解决,然而,无论我怎么尝试,它都没有成功

tjvv9vkg

tjvv9vkg1#

试试看:

type ArrayKeyof<T> = {
  [P in keyof T]-?: any[] extends T[P] ? P : never;
}[keyof T];

export type ArrayRequired<T> = Omit<T, ArrayKeyof<T>> & Required<Pick<T, ArrayKeyof<T>>>;

// demo

interface IExample {
    a: number,
    b?: string,
    c?: number[]
}

const d: ArrayRequired<IExample> = {
  a: 1,
  c: [1],
}

请在此处查看演示。

o7jaxewo

o7jaxewo2#

我有这样的做法:
如果您希望保留所有必需的类型,可以使用KeepAllSameButArraysRequired,但如果您希望它们是可选的,并且只需要数组,则使用OnlyArrayRequired

interface IExample {
    a: number,
    b?: string,
    c?: number[]
}
type ArrayKeys<T> = {
    [K in keyof T]: Array<any> extends T[K] ? K : never
}[keyof T];

type OnlyArrayRequired<T extends object> = Partial<T> & Pick<Required<T>, ArrayKeys<T>>

type KeepAllSameButArraysRequired<T extends object> = T & Pick<Required<T>, ArrayKeys<T>>

const testOnlyArray: OnlyArrayRequired<IExample> = {
    c: [] // ok
}

const testKeepingRequriedTypesButNowArrayIsRequired: KeepAllSameButArraysRequired<IExample> = {
    a: 4, // Now need "a"
    c: [] // ok
}

相关问题