typesript 知识点 持续更新中。。。

46 阅读5分钟

keyof

在TypeScript中,keyof是一个类型操作符,它用于获取一个类型的所有属性名称组成的联合类型。例如,有如下代码:

interface Person {
  name: string;
  age: number;
}

type PersonKeys = keyof Person;
// PersonKeys的值为 "name" | "age"

可以看到,我们通过keyof操作符获取了Person接口的所有属性名称,得到了一个字符串字面量类型"name" | "age"的联合类型。

使用keyof操作符可以对类型中的属性名称进行推导,可以用于创建通用的类型定义,以便于代码复用。它通常和其他类型操作符(如PickExcludePartial等)一起使用,以便更灵活地操作类型。比如,使用Pickkeyof操作符,我们可以选择Person类型中指定的属性定义一个新的类型:

type PersonName = Pick<Person, "name">;
// PersonName的值为 { name: string; }

上述代码中,我们使用Pick操作符选择了Person类型中的name属性,然后结合keyof操作符,在类型定义时就不需要显式写出属性名,而是使用字符串字面量"name"作为参数传递给Pick类型操作符,让TypeScript自动推导出对应的属性类型。

in

用于遍历 联合类型的属性

     

typeof

在 TypeScript 中,typeof 操作符用于获取一个值或类型的运行时类型。这个运算符经常在类型抽象中使用,例如,获取一个函数的返回值类型。下面是一个简单的例子:

function foo(x: number) {
  return x + 1;
}

type FooReturnType = typeof foo; // 将推断 FooReturnType 为 (x: number) => number

在上面的例子中,我们使用 typeof 操作符获取函数 foo 的类型并将其赋值给类型别名 FooReturnType。这个类型别名被推断为一个函数的类型,它接受一个数字参数并返回一个数字。

除了函数的运行时类型,typeof 操作符也可以用于获取其他值或类型的信息。例如,我们可以使用 typeof 操作符获取一个变量的类型:

const foo = 42;
type FooType = typeof foo; // 将推断 FooType 为 number

在这个例子中,我们使用 typeof 操作符获取变量 foo 的类型并将其赋值给类型别名 FooType。由于 foo 是一个数字,所以 FooType 被推断为 number 类型。

typeof 操作符还可以结合 keyof 操作符来获取一个类型的属性名称的联合类型。例如,我们可以使用 typeof 操作符获取一个对象的属性,并将属性名称的联合类型用作函数的参数类型:

const person = {
  name: 'Alice',
  age: 30,
  address: 'Beijing',
};

function getProperty(obj: typeof person, key: keyof typeof person) {
  return obj[key];
}

getProperty(person, 'name'); // 返回 'Alice'
getProperty(person, 'age'); // 返回 30
getProperty(person, 'email'); // 错误:类型 "Person" 上不存在属性 "email"

在上面的例子中,我们使用 typeof 操作符获取 person 的类型,并将其传递给函数 getProperty 的参数 obj。我们还使用 keyof 操作符获取 typeof person 的属性名称的联合类型,并将其用作参数 key 的类型。

总之,typeof 操作符是 TypeScript 的一个有用工具,可以帮助我们更好地掌握 JavaScript 运行时的信息。通过使用 typeof 操作符,我们可以在编译时捕获更多的类型错误,从而让我们的代码变得更加类型安全。

Exclude

TypeScript中的exclude类型操作符用于从类型中排除某些属性。

假设我们有一个接口Person,它包含nameage两个属性:

interface Person {
  name: string;
  age: number;
}

现在,我们想要创建一个类型PersonWithoutAge,它包含Person接口所有属性,但是不包括age属性。这时,我们可以使用exclude操作符:

type PersonWithoutAge = Pick<Person, Exclude<keyof Person, 'age'>>;
// PersonWithoutAge = { name: string; }

keyof Person用于获取Person接口的所有属性名,然后Exclude类型操作符对这些属性名进行过滤,排除了'age'属性名。最后,使用Pick类型操作符将所有剩余的属性名集合拼合回来生成了新的类型PersonWithoutAge。该类型表示一个只包含name属性的对象类型。

使用exclude类型操作符可以帮助我们更加灵活地定义类型,排除一些不需要的属性,提高代码的健壮性。

as const

在 TypeScript 中,as const 是一种类型断言用法,它用于将表达式的类型推断为字面量类型。

当使用 as const 进行类型断言时,TypeScript 将会尽可能地将表达式的每个部分推断为最具体的字面量类型。这意味着它将会将字符串、数字和布尔值推断为精确的字符串字面量、数字字面量和布尔字面量类型。

以下是一个示例:

typescriptCopy Code
const person = {
  name: "Alice",
  age: 30,
  isStudent: true
} as const;

在上述示例中,我们使用 as constperson 对象的类型断言为 const 类型。这意味着 TypeScript 将会将 name 属性推断为 "Alice" 类型(而不仅仅是 string 类型),将 age 属性推断为 30 类型(而不仅仅是 number 类型),将 isStudent 属性推断为 true 类型(而不仅仅是 boolean 类型)。

通过使用 as const,你可以确保对象的属性都被推断为字面量类型,而不是通用的更宽泛类型。这在某些情况下可以提供更严格的类型检查。

需要注意的是,使用 as const 可能会导致对象变为只读(readonly)属性,因为它们的属性类型被推断为字面量类型后将无法被重新赋值。

Parameters

Parameters 是一个内置的工具类型(Utility Type),用于从函数类型中提取参数类型。 它接受一个函数类型作为参数,并返回该函数的参数类型元组

    function greet(name: string, age: number): void {
      console.log(`Hello, ${name}! You are ${age} years old.`);
    }

    type GreetParams = Parameters<typeof greet>;

    // GreetParams 类型将被推断为 [string, number]

Parameters 只能用于处理函数类型。如果传入的是非函数类型,TypeScript 将会报错。