![](/img/trans.png)
[英]Why TypeScript compiler doesn't handle correctly nested object filtering?
[英]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.