
typescript
Keyof是一种在typescript中使用的类型操作符,用于从一个对象类型中获取其所有属性名组成的联合类型。在某些情况下,我们可以使用Keyof推断出一个对象类型的属性名的类型,这在编写泛型代码时非常有用。
推断字符串当键只是一个字符串时的数字在某些情况下,我们可能需要根据一个对象的属性名来获取对应的属性值的类型。例如,我们有一个对象类型Person,它有一个属性名为name的属性,我们想要获取这个属性的值的类型。typescripttype Person = { name: string; age: number; gender: string;};type NameType = Person['name']; // string在上面的例子中,我们使用了Person['name']来获取Person类型中name属性的值的类型,即字符串类型。在某些情况下,我们可能想要根据一个对象的属性名来获取对应的属性值的类型,但是属性名是一个动态的字符串,它不是一个已知的字面量。这时,我们可以使用Keyof来推断出这个动态字符串的类型。typescripttype Person = { name: string; age: number; gender: string;};function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key];}const person: Person = { name: 'John', age: 25, gender: 'male',};const name: string = getProperty(person, 'name'); // 'John'const age: number = getProperty(person, 'age'); // 25const gender: string = getProperty(person, 'gender'); // 'male'在上面的例子中,我们定义了一个泛型函数getProperty,它接受一个对象obj和一个属性名key,并返回该属性的值的类型。我们使用了keyof T来限制key的类型,确保它是T类型的属性名。在函数体内部,我们使用了T[K]来获取obj[key]的类型,即属性的值的类型。使用Keyof推断字符串当键只是一个字符串时的数字在某些情况下,我们可能需要根据一个对象的属性名来获取对应的属性值的类型,并且这个属性名是一个已知的字符串。例如,我们有一个对象类型Data,它有一些属性,其中一个属性名为key,它的值为一个字符串,表示其他属性的键名。我们想要根据key属性的值来获取其他属性的值的类型。typescripttype Data = { key: string; value: number | string | boolean;};type ValueOfKey<T extends Data> = T[T['key']];const data1: Data = { key: 'value', value: 10,};const data2: Data = { key: 'name', value: 'John',};const data3: Data = { key: 'isMale', value: true,};const value1: number = getValueOfKey(data1); // 10const value2: string = getValueOfKey(data2); // 'John'const value3: boolean = getValueOfKey(data3); // true在上面的例子中,我们定义了一个泛型类型ValueOfKey,它接受一个Data类型的泛型参数T,并使用了T['key']来获取key属性的值的类型。然后,我们使用T[T['key']]来获取其他属性的值的类型,即根据key属性的值来获取其他属性的类型。在示例代码中,我们定义了三个Data类型的变量data1、data2和data3,它们的key属性的值分别为'value'、'name'和'isMale'。然后,我们使用getValueOfKey函数来获取这些变量的value属性的值的类型,并将其赋值给相应的变量value1、value2和value3。通过使用Keyof推断字符串当键只是一个字符串时的数字,我们可以更方便地根据对象的属性名来获取对应的属性值的类型,无论属性名是一个已知的字符串还是一个动态的字符串。这在编写泛型代码时非常有用,可以提高代码的灵活性和可复用性。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号