无法在联合复合类型中使用“never”

问题描述 投票:0回答:2

我试图用一个对象作为构造函数的输入来初始化一个类,这将填充该类的一个字段。

但是,该对象可以填充两个字段之一,这会在我尝试在构造函数内解析它时导致错误。

我期待以下(简化的)代码能够工作:

type Props = { name: string; age: never } | { name: never; age: number };

class Person {
  data: Props;

  constructor(data: Props) {
    if (data.name !== undefined) {
      this.data = data;
    } else {
      this.data = { // This line raises the error
        ...data,
        age: data.age * 1.5, // Even when it's just "data.age" it still raises an error
      };
    }
  }
}

但是我收到以下错误:

输入 '{ 年龄:数字;名称:字符串; }' 不可分配给类型 '{ name: never;年龄:数字; }'。
属性“name”的类型不兼容。
类型“string”不能分配给类型“never”。

typescript
2个回答
0
投票
type Props = { name: string; age: never } | { name: never; age: number };

class Person {
    data: Props;

    constructor(data: Props) {
        if (data.name !== undefined) {
            this.data = data;
        } else {
            this.data = {
                age: data.age * 1.5,
            } as Props;
        }
    }
}

0
投票

如果某个属性的类型为

never
,但不是可选,那么它将是必需的......但没有任何值可以满足要求:

TS游乐场

const noName: { name: never } = {}; /* Error
      ~~~~~~
Property 'name' is missing in type '{}' but required in type '{ name: never; }'.(2741) */

但是,如果该属性是可选的,那么就没有问题:

const noName: { name?: never } = {}; // Ok

因此,要修复您的示例,只需将排除的属性标记为可选,所有内容都会编译:

TS游乐场

type Props =
  | { name: string; age?: never }
  | { name?: never; age: number };
© www.soinside.com 2019 - 2024. All rights reserved.