为什么在TypeScript中用作函数参数后,受约束的类型会变得不受约束?

lfapxunr  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(96)
type Person = {
  [P in string]: any;
};
type Student = {
  grade: number;
};
type t0 = Student extends Person ? true : false;
type t1 = (() => Student) extends () => Person ? true : false;
type t2 = ((v: Student) => void) extends (v: Person) => void ? true : false;

t0为真,t1为真,但t2为假。
为什么t2是假的?

6jjcrrmo

6jjcrrmo1#

在您的示例中,StudentPerson更严格。因此,

type t2 = ((v: Person) => void) extends (v: Student) => void ? true : false;

将返回true,但是

type t2 = ((v: Student) => void) extends (v: Person) => void ? true : false;

返回false
编辑:
更详细地说,如果你有一个对象:

const student: Student = {
  grade: 5
}

你可以说这个学生也是一个Person,因为number(年级)扩展了any,而grade满足[P in string]。Typescript显示true-Student扩展了Person
示例中的t1返回Student。任何返回Student的函数都可以声明返回Person(基于上面的解释)。
t2是不同的,因为你 * 接受 * 一个Student的参数。如果一个函数接受一个Student,它不一定接受一个Person。所以如果你翻转它-它会工作(接受一个Person的函数肯定会接受一个更严格的Student),但反之亦然

相关问题