TS 中类型定义中常用到的知识点(collecting...)

81 阅读2分钟

as const 的用法

在 TypeScript 中,当你定义一个变量并使用 as const 进行类型断言时, 它的作用是将变量的类型变得更加具体,即变量会别推断为其包含的确切值(而不是一般的类型)。这对于创建字面量类型(literal types)非常有用。

考虑以下示例:

const example = [1,2,3] as const;

在这个例子中,使用 as const 将数组 example 的类型断言为只包含字面量值 1, 2, 3 的只读数组。这意味着 example 的类型别精确地推断为 readonly [1,2,3],而不是不同的 number[] 类型。

这样做的好处是,当你尝试修改 example 中的元素,或者将新的值赋给 example 中的元素时, TypeScript 将会发生错误,因为它们被视为只读的字面量值。

example[0] = 4; // Error: Index signature in type 'readonly [1, 2, 3]' only permits reading.

example.push(4); // Error: Propertyp '4' does not exist on type 'readonly [1, 2, 3]'.

通过这种方式,你可以确保在程序的后续部分中不会不小心修改或扩展改变量的值。这对于确保类型的精确性和避免错误非常有帮助。

infer 的用法

在 TypeScript 中,infer 关键字通常与条件类型(Conditional Types)一起使用,用于推断类型。条件类型是一种在类型系统中进行条件分支的方式,而 infer 用于在条件类型内引入新的类型变量,以便在后续的类型定义中使用。

type ExtractType<T> = T extends Array<infer U> ? U : never;

const myArray: number[] = [1, 2, 3];

type ElementType = ExtractType<typeof myArray>;

// ElementType 的类型被推断为 number

Parameters 的用法

在 TypeScript 中,Parameters 是一个内置的工具类型(Utility Type),用于获取函数类型的参数类型列表。通过使用 Parameters, 你可以轻松地获取一个函数的参数类型数组。

以下是一个简单是示例:

// 定义一个函数类型
type MyFunctionType = (name: string, age : number) => void;

// 使用 Parameters 获取 MyFunction 的参数类型数组
type MyFunctionParameters = Parameters<MyFunctionType>;

// MyFunctionParameters 现在是一个元组类型,包含两个元素,分别是 string 和 number。
// 结果类型为 [string, number]

在这个示例中, MyFunctionParameters 被推断为一个元组类型 [string, number], 其中包含了 MyFunctionType 中定义的两个参数的类型。

你也可以直接使用 Parameters 来获取函数的参数类型,而不必显示声明函数类型。
例如:

function  myFunction(name: string, age: number) {
  // do something...
}

type MyFunctionParameters = Parameters<typeof myFunction>;

// MyFunctionParameters 现在是一个元组类型,包含两个元素, 分别是 string 和 number。
// 结果类型为 [string, number]