首页 > 解决方案 > 为什么打字稿不能通过泛型函数验证返回类型?

问题描述

我想用泛型验证返回类型。但是像吹这样的行为让我很困惑:

interface IT {
  name: string;
}

interface check<T>   {
  get(): Partial<T>;
};

// works
var g: check<IT> = {
    get() {
        return {
            name: 'sdsdf',
            error: 'asdad'
        }
    }
}

// error
var e: check<IT> = {
    get() {
        return {
            name: 123
        }
    }
}

// error
var f: check<IT> = {
    get() {
        return {
            error: 'asdad'
        }
    }
}

为什么当返回类型扩展泛型类型时,它可以通过类型检查?

标签: typescript

解决方案


想知道为什么{ name: '123', error: '123' } 也可以通过类型检查。错误没有被定义

这是因为可分配性。

请考虑下一个示例:

interface IT {
  name: string;
}

interface check<T> {
  get(): Partial<T>;
};

var g: check<IT> = {
  get() {
    return {
      name: 'sdsdf',
      error: 'asdad'
    }
  }
}

interface IT2 {
  name: string,
  error: string
}

declare var a: IT
declare var b: IT2

a = b // ok

b = a // error

如您所见,可以将 IT2 分配给 IT,但反之则不行。

但为什么???

这就是 TypeScript 中类型的工作方式。请参阅文档的第一个示例

类型检查器检查对 printLabel 的调用。printLabel 函数有一个参数,该参数要求传入的对象具有称为字符串类型标签的属性。请注意,我们的对象实际上具有比这更多的属性,但编译器仅检查是否至少存在所需的属性并匹配所需的类型。在某些情况下,TypeScript 不那么宽松,我们稍后会介绍。

TypeScript中没有Exact类型,但是这里有一个打开的输入链接描述

请记住,下一个代码将失败:

const bar = g.get().error // error

推荐阅读