gpt4 book ai didi

typescript - 对象解构防止 typescript 歧视

转载 作者:行者123 更新时间:2023-12-04 14:22:43 28 4
gpt4 key购买 nike

我一直在使用标记的联合类型来处理 typescript 歧视,但我遇到了一些奇怪的事情。如果我打开实际的对象属性,一切都会按预期工作。但是如果我使用解构,typescript 会报错。我认为它与编译时解构的实际工作方式有关,但我不确定。您可以在 playground 上看到此示例代码

interface Foo {
discriminate: 'FOO';
details: string;
}

interface Bar {
discriminate: 'BAR';
numbers: number;
}

type FooOrBar = Foo|Bar;

const foo : Foo = {
discriminate: 'FOO',
details: 'Blah Blah Blah'
}

const breakTaggedUnionWithRest = ({discriminate, ...fooBar} : FooOrBar) => {
switch(discriminate) {
case 'FOO':
console.log(fooBar.details);
break;
}
}

interface Foo2 {
discriminate: 'FOO2';
details: string;
}

interface Bar2 {
discriminate: 'BAR2';
details: number;
}

type FooOrBar2 = Foo2|Bar2;

const breakTaggedUnionWithoutRest = ({discriminate, details} : FooOrBar2) => {
switch(discriminate) {
case 'FOO2' : return details.toLowerCase();
}
}

const workingExample = (fooOrBar: FooOrBar) => {
switch(fooOrBar.discriminate) {
case 'FOO': return fooOrBar.details;
}
}

const workingExample2 = (fooOrBar: FooOrBar2) => {
switch(fooOrBar.discriminate) {
case 'FOO2': return fooOrBar.details.toString;
}
}

最佳答案

如果不解构,discriminator 属性上的switch-case 允许TypeScript 缩小整个fooOrBar 对象的类型并正确推断该对象的其他属性的类型。这是因为 TypeScript 知道您正试图通过对象的属性进行区分。

但是,通过解构,discriminate 和其他变量(第一个示例中的 fooBar 和第二个示例中的 details)变得与每个变量都不相关其他。因此,在 case 中,TypeScript 不会推断出另一个变量的类型可能会变窄,因为 switch 下的变量和您要尝试的变量此时访问权限没有任何关系。

关于typescript - 对象解构防止 typescript 歧视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211125/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com