首页 > 解决方案 > Typescript:如果属性值来自嵌套对象,为什么我的代码无法编译?

问题描述

我为这个糟糕的标题道歉,但我没有更好的词汇来形容它。让我向您展示我的代码:

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不编译,我想要它。为什么不编译,如何编译?


答案没有明确说明这一点,所以我会:这个问题没有解决方案。

标签: typescripttypestypescript-typings

解决方案


我相信答案是这样的,但也许 Jcalz 可以纠正我。

“A”的工会 | “B”实际上有 3 个可分配性。

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

第三种情况破坏了valid4。在价值层面,这是不可能的,但在类型层面,它的两个“条形”| 都有可能。“baz”,因此它认为......

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

是可能的。

至于valid3,这是因为Typescript编译器可以检测到你已经硬编码了那里的值,因此即使你断言“Foo”它认为的实际类型是“bar”


推荐阅读