我试图用一个对象作为构造函数的输入来初始化一个类,这将填充该类的一个字段。
但是,该对象可以填充两个字段之一,这会在我尝试在构造函数内解析它时导致错误。
我期待以下(简化的)代码能够工作:
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”。
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;
}
}
}
never
,但不是可选,那么它将是必需的......但没有任何值可以满足要求:
const noName: { name: never } = {}; /* Error
~~~~~~
Property 'name' is missing in type '{}' but required in type '{ name: never; }'.(2741) */
但是,如果该属性是可选的,那么就没有问题:
const noName: { name?: never } = {}; // Ok
因此,要修复您的示例,只需将排除的属性标记为可选,所有内容都会编译:
type Props =
| { name: string; age?: never }
| { name?: never; age: number };