簡體   English   中英

Typescript:如果屬性值來自嵌套的 object,為什么我的代碼無法編譯?

[英]Typescript: Why doesn't my code compile if a property value comes from a nested object?

我為這個糟糕的標題道歉,但我沒有更好的詞匯來形容它。 讓我向您展示我的代碼:

type Foo = "bar" | "baz";

type Consistency  = {
    [K in Foo]: {
        foo: K;
        fooTemplate: `${K} in a template`;
    }
}[Foo]

// I want this to compile (and it does)
const valid1: Consistency = {
    foo: "bar",
    fooTemplate: "bar in a template",
}

const valid2: Consistency = {
    foo: "baz",
    fooTemplate: "baz in a template",
}

export const anFoo: Foo = "bar"

const valid3: Consistency = {
    foo: anFoo,
    fooTemplate: `${anFoo} in a template` as const
}

export interface MyObj {
  temporary: {    
    myProperty: Foo;    
  };
}
const state: MyObj = {
    temporary: {
        myProperty: "bar" 
    }
}
const i: Foo = state.temporary.myProperty;
const valid4: Consistency = { // Why doesn't this one compile????
    foo: i,
    fooTemplate: `${i} in a template` as const
}

// I don't want this to compile (and it doesn't)
const invalid1: Consistency = {
    foo: "bar",
    fooTemplate: "baz in a template",
}

const invalid2: Consistency = {
    foo: "baz",
    fooTemplate: "bar in a template",
}

你可以在這里玩這個。 這一切都按照我期望接受valid4的方式工作。 出於某種原因, valid4無法編譯,我想要它。 為什么不編譯,如何編譯?


答案沒有明確說明這一點,所以我會:這個問題沒有解決方案。

我相信答案是這樣的,但也許 Jcalz 可以糾正我。

“A”的工會 | “B”實際上有 3 個可分配性。

“A”是可分配的。 “B”是可分配的。 和“A” | “B”是可分配的

第三種情況破壞了valid4。 在價值層面,這是不可能的,但在類型層面,它的兩個“條形”| 都有可能。 “baz”,因此它認為......

{foo: "baz", fooTemplate: "bar as template"}

是可能的。

至於valid3,這是因為Typescript編譯器可以檢測到你已經硬編碼了那里的值,因此即使你斷言“Foo”它認為的實際類型是“bar”

暫無
暫無

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

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