keyof
在TypeScript中,keyof是一个类型操作符,它用于获取一个类型的所有属性名称组成的联合类型。例如,有如下代码:
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person;
// PersonKeys的值为 "name" | "age"
可以看到,我们通过keyof操作符获取了Person接口的所有属性名称,得到了一个字符串字面量类型"name" | "age"的联合类型。
使用keyof操作符可以对类型中的属性名称进行推导,可以用于创建通用的类型定义,以便于代码复用。它通常和其他类型操作符(如Pick、Exclude、Partial等)一起使用,以便更灵活地操作类型。比如,使用Pick和keyof操作符,我们可以选择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,它包含name和age两个属性:
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 const 将 person 对象的类型断言为 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 将会报错。