keyof
和 typeof
keyof
和typeof
都是 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
的使用场景示例:
- 检查变量值的类型
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
操作符,我们可以确定它们的类型,并相应地执行其他逻辑。
- 检查函数参数的类型
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
中的指定属性组成的新类型。