一、tskeyof的介紹
tskeyof是TypeScript的一個Type Operator,用於獲取一個類型中所有屬性名的聯合類型。使用該操作符可以使屬性訪問時具有類型約束和類型推導功能。
type Person = {
name: string;
age: number;
};
type PersonKeys = keyof Person; // "name" | "age"
如上代碼所示,PersonKeys的類型就是Person中所有屬性名的聯合類型。
二、tskeyof的作用
1. 使用tskeyof進行類型安全的屬性訪問
使用tskeyof獲取一個對象的所有屬性名後,可以使用該類型進行類型安全的屬性訪問。
type Person = {
name: string;
age: number;
};
const person: Person = {
name: '張三',
age: 20,
};
function getProperty(obj: object, key: string) {
return obj[key]; // 潛在的類型錯誤
}
getProperty(person, 'name'); // '張三'
getProperty(person, 'gender'); // undefined(潛在的類型錯誤)
function getProperty2(obj: T, key: K) {
return obj[key]; // 類型安全的訪問
}
getProperty2(person, 'name'); // '張三'
getProperty2(person, 'gender'); // 編譯時錯誤:Argument of type '"gender"' is not assignable to parameter of type '"name" | "age"'.
如上代碼所示,getProperty函數在訪問對象屬性時沒有對屬性名進行任何類型檢查,可能會導致潛在的類型錯誤。而使用tskeyof後,getProperty2函數會在編譯時對屬性名進行類型檢查,從而避免屬於類型錯誤的產生。
2. 使用tskeyof進行動態屬性訪問
如果需要動態地訪問對象中的屬性,可以使用泛型類型和tskeyof組合實現動態屬性訪問。
function getProperty3(obj: T, key: K) {
return obj[key];
}
const person = {
name: '張三',
age: 20,
};
getProperty3(person, 'name'); // '張三'
getProperty3(person, 'age'); // 20
三、tskeyof的高級用法
1. 使用tskeyof實現類型推導
使用tskeyof可以實現類型推導,從而避免重複定義類型。
type State = {
name: string;
age: number;
};
type Action = {
type: string;
payload: any;
};
type UpdateAction = Action & {
payload: {
key: K;
value: State[K];
}
};
// 使用
const updateNameAction: UpdateAction = {
type: 'update',
payload: {
key: 'name',
value: '張三'
}
};
const updateAgeAction: UpdateAction = {
type: 'update',
payload: {
key: 'age',
value: 20
}
};
如上代碼所示,UpdateAction使用了tskeyof,從而實現了類型推導,避免了重複定義類型。
2. 使用tskeyof實現類型衍生
使用tskeyof可以實現類型衍生,從而擴展類型。
type Person = {
name: string;
age: number;
};
type PersonWithGender = Person & {
gender: 'male' | 'female';
};
type Identify = {
[K in keyof T]: { id: number };
};
// 使用
const person: Person = {
name: '張三',
age: 20,
};
const personWithGender: PersonWithGender = {
name: '張三',
age: 20,
gender: 'male',
};
const identifiedPerson = <Identify>{
name: '張三',
age: 20,
id: { id: 1 },
};
const identifiedPersonWithGender = <Identify>{
name: '張三',
age: 20,
gender: 'male',
id: { id: 1 },
};
如上代碼所示,使用tskeyof可以擴展已有的類型,實現類型衍生。
小結
本文介紹了如何使用tskeyof進行類型安全的屬性訪問,並對tskeyof的作用和高級用法進行了介紹。使用tskeyof可以在類型層面進行屬性訪問的類型檢查,避免了潛在的類型錯誤。此外,tskeyof還能夠實現類型推導和類型衍生,從而簡化代碼。
原創文章,作者:VTQA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144974.html