类型'{ visibility: string;'line-join': string;'line-cap': string; } | { visibility: string; }'不能赋值给类型。

3

我正在使用angular和mapbox。我尝试使用mapbox显示/隐藏一些内容。

因此,我有这个组件:

export class ToggleLayersComponent implements OnInit {
  layouts = {
    contours: {
      visibility: 'visible',
      'line-join': 'round',
      'line-cap': 'round',
    },
    museums: {
      visibility: 'visible',
    },
  };

  ngOnInit() {}

  toggleLayer(evt: {value: 'contours' | 'museums'}) {
    this.layouts[evt.value] = {
      ...this.layouts[evt.value],
      visibility: this.layouts[evt.value].visibility === 'visible' ? 'none' : 'visible',
    };
  }
}

但是我遇到了这个错误:

Type '{ visibility: string; 'line-join': string; 'line-cap': string; } | { visibility: string; }' is not assignable to type '{ visibility: string; 'line-join': string; 'line-cap': string; } & { visibility: string; }'.
  Type '{ visibility: string; }' is not assignable to type '{ visibility: string; 'line-join': string; 'line-cap': string; } & { visibility: string; }'.
    Type '{ visibility: string; }' is missing the following properties from type '{ visibility: string; 'line-join': string;

当然,我先尝试了谷歌搜索,但是我没有找到任何解决方案。

那么该怎么解决呢?

谢谢。

所以错误出现在这一行:

 this.layouts[evt.value] 

所以我现在甚至无法运行Angular:

ERROR in src/app/desktop-dashboard/toggle-layer/toggle-layer.component.ts:63:5 - error TS2322: Type '{ visibility: string; 'line-join': string; 'line-cap': string; } | { visibility: string; }' is not assignable to type '{ visibility: string; 'line-join': string; 'line-cap': string; } & { visibility: string; }'.    
  Type '{ visibility: string; }' is not assignable to type '{ visibility: string; 'line-join': string; 'line-cap': string; } & { visibility: string; }'.      
    Type '{ visibility: string; }' is missing the following properties from type '{ visibility: string; 'line-join': string; 'line-cap': string; }': 'line-join', 'line-cap'

63     this.layouts[evt.value] = {
1个回答

2

TypeScript编译器目前还不够“智能”。当您进行以下操作时:

this.layouts[evt.value] = {
  ...this.layouts[evt.value]
}

它将evt.value视为类型'contours' | 'museums',但它无法推断两次相同的值也是同一个对象。基本上,它防止您执行以下操作:
this.layouts['contours'] = {
  ...this.layouts['museums']
}

在您的示例中,您可以执行以下操作:
this.layouts[evt.value].visibility = this.layouts[evt.value].visibility === 'visible'
  ? 'none'
  : 'visible';

但我想你可能不想这样做,因为变化检测可能无法发现对象引用已更改。如果这对您是一个问题,那么我认为除了欺骗编译器之外别无选择:

toggleLayer(evt: {value: 'contours' | 'museums'}) {
  const key = evt.value as 'contours';

  this.layouts[key] = {
    ...this.layouts[key],
    visibility: this.layouts[key].visibility === 'visible' ? 'none' : 'visible'
  };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接