打字稿:运算符'==='不能应用于类型'“ x”'和'y'。三元运算符

时间:2018-10-03 20:19:51

标签: typescript

你好,我在一个数组中有一个三元运算符:

[5,-1,1,0,2,1,7,11,-3,-1,-2,0,-1,5,9,-4,-5,-3,-4,2,6,1,3,2,8,12,1,0,6,10,1,7,11,5,9,10]

打字稿似乎认为

this.columns = [ { name: 'item' === 'list' ? 'list' : 'n/a' } ];

我要声明它的类型,以便引发错误。谁能建议另一种写此三元运算符的方法,这样我就不会出现此错误?

编辑:我了解: 'item'始终为假。由于要使用的库,它必须采用这种格式。左侧与库的属性匹配:

'item' === 'list'

我的坏事我应该早点解释

3 个答案:

答案 0 :(得分:0)

您会收到编译错误,因为'item' === 'list'将始终返回false。您在这里比较2个文字。

如果您使用变量而不是文字,它将进行编译。

var item = 'item';
this.columns = [
  {
    name: item === 'list' ? 'list' : 'n/a' 
  }
];

编辑:

应该将对象分配给某些对象。让我们将其命名为道具:

const props = {
  item: 'list'
}

this.columns = [
  {
    name: props.item === 'list' ? 'list' : 'n/a' 
  }
];

答案 1 :(得分:0)

Typescript的概念为literal types。 您正在测试两个不同的文字是否相等-这是不可能的,因为类型(文字类型!)是不同的。您只能比较可能相等的对象。

看看这个例子,它有同样的缺陷:

const x = 'item';
const y = 'list';
const test = (x === y);

TypeScript编译器会在x === y部分抱怨这一点,因为x具有类型(和值)"item",而y具有类型(和值){ {1}}。

这些文字字符串类型是"list"的子类型,但相等运算符需要更多-string类型的x只能由X===进行比较如果假设一个对象可能同时属于yY类型(如果很好,如果XY的子类型。

您收到的消息Y表明了这一点。

在TypeScript 3.0+上,您还会收到另一条易于理解的消息:X

请注意以下内容将起作用,因为您明确地隐藏了一些类型信息:

Operator  '===' cannot be applied to types '"item"' and '"list"'

在您的示例中,您可能会写:

This condition will always return 'false' since the types '"item"' and '"list"' have no overlap.

答案 2 :(得分:0)

在编辑问题后重新阅读问题后,您处于以下情况:

从某个通话中您得到了一个对象,我们称它为obj,其中包含

{
   item: 'list'
}

obj旁边的item中可能还有更多属性。

现在,您要创建一个数组(可能是列定义),其内容取决于item中属性obj的值。 您试图通过简单地编写'item'来获取该属性的值-这样做并非如此。要正确执行,请输入:

this.columns = [
  {
    name: obj.item === 'list' ? 'list' : 'n/a' 
  }
];

请注意,如何通过编写item来显式访问obj的属性obj.item