javascript - 为什么流类型转换不能按预期对字符串文字起作用

标签 javascript flowtype

对于下面的示例,为什么类型转换在 Flowtypes 中不起作用?理想的做法应该是什么?

type typeA = {
  name: 'ben' | 'ken',
};
type typeB = {
  name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA;

出现错误

Cannot assign `objA` to `objB` because in property `name`: Either  string [1] is incompatible with  string literal `ben` [2]. Or  string [1] is incompatible with  string literal `ken` [3].

但是,对于 typescript 来说,这很好。

最佳答案

让我们检查一下为什么您的代码不安全,Flow Try :

type typeA = {
  name: 'ben' | 'ken',
};
type typeB = {
  name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA // correctly catches error here because...

const mutateTypeB = (val: typeB): void => {
   val.name = "len"; // ...no error is caught here
}

mutateTypeB(objB);
// now objA.name = "len"  

这意味着您可以使用与 typeA 不匹配但与 typeB 匹配的 name 属性来改变 objA >。这显然是不安全的。

您的错误可以通过两种方式解决:

  1. 将 name 设为 typeB 中的 ReadOnly 字段 Flow Try
type typeA = {
  name: 'ben' | 'ken',
};
type typeB = {
  +name: string,
};
const objA: typeA = { name: 'ben' };
const objB: typeB = objA;

const mutateTypeB = (val: typeB): void => {
   val.name = "len"; // error caught here instead
}

mutateTypeB(objB);
// now objA.name = "len"   
  • string 添加为 typeA 中联合的一部分 Flow Try
  • type typeA = {
      name: 'ben' | 'ken' | string,
    };
    type typeB = {
      name: string,
    };
    const objA: typeA = { name: 'ben' };
    const objB: typeB = objA;
    

    您可以阅读有关此确切问题的更多信息 here

    关于javascript - 为什么流类型转换不能按预期对字符串文字起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73498389/

    相关文章:

    javascript - 仅在 ng-repeat 列表中显示唯一日期值

    javascript - 在使用 Flow 扩展 EventEmitter 的类中限制 `eventName` 的类型?

    javascript - 使用 Flowjs 输入类时出现问题

    javascript - 手动将 Cordova 插件添加到 Cordova 项目的正确方法是什么

    javascript - jQuery Mobile 1.4.3 修复了工具栏和页面内容问题

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

    javascript - React$Element 和 ReactElement 有什么区别

    reactjs - 如果在node_modules中有react和react-native,flow会提示

    javascript - 使用 CSS : Absolute Positioning Conversation to Bottom while Maintaining Scroll 重新创建电话短信 UI

    javascript - 切片颜色的谷歌饼图动画