簡體   English   中英

通過兄弟屬性推斷 object 類型 - Typescript

[英]Infer object types by sibling property - Typescript

是否可以根據同一 object 中的另一個屬性斷言 object 的屬性?

但是如何根據type屬性的values推斷值的類型呢?

type StepKeys = "Test1" | "Test2";

interface objectMap {
    "Test1": {
        name: string
    },
    "Test2": {
        age: number
    }
};

interface Step<T extends StepKeys = StepKeys> {
    type: T;
    value: objectMap[T]
};

const steps: Record<string, Step> = {
    "Step1": {
        type: "Test1",
        value: {

        }
    }
}

這里values的類型是{ name: string; } | { age: number; } { name: string; } | { age: number; } { name: string; } | { age: number; }

是否可以推斷出它的可能值?

Typescript

你好,如果你想有效地區分這個聯合,類型參數不應該是一個聯合,而是尋求將聯合“推”到一種類型。 這是因為我們希望每個Step類型都有自己唯一的類型參數,而不是可能類型參數的聯合。 所以一個小的改變,但完成你想要的。

const steps: Record<string, Step<'Test1'> | Step<'Test2'>> = {
    "Step1": {
        type: "Test1",
        value: {
            // infer ?
            age: 11,
// ^^^ correctly throws error 
// Object literal may only specify known properties, and 'age' does not exist in type '{ name: string; }'.(2322)
            name: 'test',
        }
    }
}

使用索引訪問 map 類型,如果有更多的鍵/值對,您可以自動創建可區分的聯合。

type Steps = Record<string, {
    [key in StepKeys]: Step<key>
}[StepKeys]>

在 TS 游樂場上查看

實現你想要的東西的唯一方法並不是很好,但它確實有效。 問題是你必須手動輸入每個密鑰(這使得它不可能通用或可擴展)。

interface PeoplePropsMap {
    withName: {
        name: string
    },

    withAge: {
        age: number
    }
};

type People =
    { type: 'withName', value: PeoplePropsMap['withName'] } |
    { type: 'withAge',  value: PeoplePropsMap['withAge']  }

const steps: Record<string, People> = {
    john: {
        type: 'withAge',
        value: {
            age: 10  
        }
    }
}

暫無
暫無

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

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