gpt4 book ai didi

flowtype - 访问联合类型属性的惯用方法

转载 作者:行者123 更新时间:2023-12-02 19:13:52 25 4
gpt4 key购买 nike

访问联合类型中合并的类型之一可能缺少的联合类型属性的惯用方法是什么?

type DataColumn = {
value: number;
};

type CalculatedColumn = {
calculation: string;
};

type Column = DataColumn | CalculatedColumn;

function getValue(c: Column) {
return c.value || c.calculation;
}

流量typecheck结果出现以下错误:

13:   return c.value || c.calculation;
^ property `calculation`. Property not found in
13: return c.value || c.calculation;
^ object type

@dfkaye在 Twitter 上指出,如果“默认”情况抛出错误,它会起作用:

function e() {
throw new Error('foo');
}

function getValue(c: Column) {
return c.value || c.calculation || e();
}

谁能解释一下:

  1. 为什么它有效?这是故意的还是副作用?
  2. 为什么有必要?列类型始终为计算,因此永远不会发生错误情况。
  3. 有更好、更惯用的方式吗?
  4. 这是一种安全的方法,还是将来可能会失败?

PS:看起来像 TypeScript it can be done使用类型断言。

最佳答案

惯用的方法是使用 disjoint unions 。这通过了,没有错误:

type DataColumn = {
kind: 'data';
value: number;
};

type CalculatedColumn = {
kind: 'calculated';
calculation: string;
};

type Column = DataColumn | CalculatedColumn;

function e() {
throw new Error('foo');
}

function getValue(c: Column) {
return c.kind === 'data' ? c.value : c.calculation;
}

getValue({kind: 'data', value: 123});
getValue({kind: 'calculated', calculation: 'foo'});

我实际上不确定为什么你描述的情况不起作用。我想不出任何理由它会不健全。但不相交的联合肯定有效。

关于flowtype - 访问联合类型属性的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40874530/

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