簡體   English   中英

Typescript 條件擴展嵌套 object

[英]Typescript conditional extends with nested object

我正在構建一個類型來檢查類類型的成員是否是 object,如果是,則必須分配特定類型。 我在下面提供了一個更具解釋性的示例。

在這里,我們將使用 class 示例。

declare class myObject {
    name?: string
    id?: number
    parent?: {
        child: number
    }
}

在這里,我們有我想要制作的類型

type myType<T> = {
    [K in keyof T]: T[K] extends {[k:string]:any} ? T[K] : "something"
}

它應該檢查parent成員實際上是該類型的 object 並允許這樣的事情

const example: myType<myObject> = {
    parent: {
        child: 0
    },
    name: "something"
    id: "something"

但這不是因為parent? 沒有針對{[k:string]:any}成功檢查。 這是因為parent? 是可選成員。 如果我改變parent? parent它按預期工作。 為了嘗試解決這個問題,我嘗試用{[Z in keyof T[K]]?: T[K][Z]}切換{[k:string]:any} } 但我觀察到了相同的行為。

TS Playground的鏈接

如果我正確理解您的問題,那么您可以執行以下操作:

type MyType<T> = {
    [K in keyof T]: T[K] extends {[k:string]:any} | undefined ? T[K] : "something"
}

? 賦予屬性undefined的可能性(可選),因此您可以將{[k:string]:any}替換為[k:string]:any} | undefined [k:string]:any} | undefined

當你說這是因為parent? 是可選成員。

但是,成為可選成員意味着什么?

在 JS 中,這意味着屬性可以具有值或未定義。

在TS中,是指parent? 實際上是這樣的: {[k:string]: any} | undefined {[k:string]: any} | undefined

下面的代碼解決了鏈接的 TS 操場上的錯誤。

type myType<T> = {
    [K in keyof T]?: T[K] extends ({[k:string]: any} | undefined) ? T[K] : "something"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM