首页 > 解决方案 > 打字稿无法确定类型

问题描述

我有 2 个具有匹配界面的猫对象

有人可以向我解释为什么我不能将 c1 设置为数字并将 c2 设置为字符串吗?

它不应该能够推断函数中的类型吗?

interface Cat {
    name: string;
    size:  string | number;
}

function getCatSize(cat : Cat)  {

    if ( isNaN(Number(cat.size)))  {
        return cat.size;
    } else { 
        return cat.size;
    }
}


  let cat1 : Cat = {
    name: "Cat1",
    size:  "Big"
  };

  let cat2 : Cat = {
    name: "Cat2",
    size:  10
  };


  var c1 : string = getCatSize(cat1);
  // Type 'string | number' is not assignable to type 'string'. 
  // Type 'number' is not assignable to type 'string'

  var c2 : number = getCatSize(cat2);
  // Type 'string | number' is not assignable to type 'number'.
  // Type 'string' is not assignable to type 'number'.ts(2322)

标签: typescript

解决方案


getCatSize接受Cat。因此,您可以为对象分配一个size属性,即numberor ,但不会以任何方式捕获string有关该函数是否使用numberor版本调用的信息。string函数本身也返回number | string,打字稿不能隐含地遵循测试size和返回值之间的关系。

您可以编写一个函数,该函数使用泛型类型参数来捕获调用该函数的实际类型并返回该类型。

interface Cat<T extends string | number = string | number> {
    name: string;
    size: T;
}
function getCatSize<T extends string | number>(cat: Cat<T>): T {

    if (isNaN(Number(cat.size))) {
        return cat.size;
    } else {
        return cat.size;
    }
}


let cat1: Cat<string> = {
    name: "Cat1",
    size: "Big"
};

let cat2: Cat<number> = {
    name: "Cat2",
    size: 10
};


var c1: string = getCatSize(cat1);

var c2: number = getCatSize(cat2);


推荐阅读