Skip to content
On this page

keyoftypeof

keyoftypeof 都是 TypeScript 中的类型操作符,用于获取类型或类型成员。下面分别举例说明它们的使用场景。

keyof 的使用场景

keyof 用于获取一个对象类型的所有属性名构成的联合类型。这个联合类型可以被用于很多不同的场景,例如:

  • 获取对象中某个属性的类型
  • 定义泛型类型,将对象属性名作为泛型变量
  • 索引对象中的属性

下面是一些具体的例子:

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

type PersonKeys = keyof Person; // "name" | "age"

function getProperty<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

const person: Person = { name: "Alice", age: 30 };
console.log(getProperty(person, "name")); // "Alice"

在上面的例子中,我们定义了一个 Person 接口,并使用 keyof 操作符获取了它的属性名联合类型。然后,我们使用 getProperty 函数来获取 person 对象的某个属性的值,并使用 key 参数来限制只能传入 Person 的属性名。

typeof 的使用场景

typeof 用于获取一个值的类型。这个操作符可以被用于很多不同的场景,例如:

以下是 typeof 的使用场景示例:

  1. 检查变量值的类型
typescript
const str = "hello";
const num = 42;
const arr = ["a", "b", "c"];

console.log(typeof str); // 输出 string
console.log(typeof num); // 输出 number
console.log(typeof arr); // 输出 object

通过对变量的值使用 typeof 操作符,我们可以确定它们的类型,并相应地执行其他逻辑。

  1. 检查函数参数的类型
typescript
function logValue(value: number | string) {
  if (typeof value === "string") {
    console.log("The value is a string: ", value);
  } else {
    console.log("The value is a number: ", value);
  }
}

logValue("hello"); // 输出 The value is a string: hello
logValue(42); // 输出 The value is a number: 42

在这个示例中,我们定义了一个名为 logValue 的函数,并且它接受一个类型为 number | string 的参数 value。根据传入的实际值来判断参数的类型,我们可以使用 typeof 操作符并进行相应的处理.

总之,typeof 可以用于任何需要在运行时确定 JavaScript / TypeScript 对象的类型的情况,从而使代码更加健壮、可维护和易读。

keyof typeof 一起使用

在 TypeScript 中,keyof typeof 是一种类型查询运算符,它可以用于获取一个对象的所有属性名组成的联合类型。

示例一:

typescript
const obj = { a: 1, b: 2, c: 3 };
type Keys = keyof typeof obj; // 'a' | 'b' | 'c'

这个联合类型可以用于定义一些通用的函数类型或者泛型类型,例如:

typescript
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
  const result: any = {};
  keys.forEach(key => result[key] = obj[key]);
  return result;
}

const obj = { a: 1, b: 2, c: 3 };
const picked = pick(obj, ['a', 'c']); // { a: 1, c: 3 }

这里的 K extends keyof T 约束了 K 必须是 T 的属性名类型之一,然后使用 Pick<T, K> 来获取 T 中的指定属性组成的新类型。

Released under the MIT License.