我有一個函式,getProperty它可以在我的測驗用例中接受不同型別的 args 我有兩個不同的 argsfirstname和lastName
在我的getProperty函式中,我有 if 陳述句來檢查傳入的引數,然后回傳那個引數。
根據我的理解,Generic 是我需要使用的,但出現錯誤 Property 'firstName' does not exist on type 'T'.
我如何正確輸入 Generic 使其作業?
type TdataV1 = {
firstName: string
}
type TdataV2 = {
lastName: string
}
const dataV1: TdataV1 = {
firstName: 'Name',
}
const dataV2: TdataV2 = {
lastName: 'Name',
}
const getProperty = <T>(data: T): string => {
if (data.firstName) {
return data.firstName
}
if (data.lastName) {
return data.lastName
}
}
getProperty<TdataV1>(dataV1)
getProperty<TdataV2>(dataV2)
uj5u.com熱心網友回復:
你的型別有一個空的交集(沒有公共欄位)所以你應該這樣寫:
const getProperty = (data: TdataV1 | TdataV2): string => {
if ('firstName' in data) {
return data.firstName
}
if ('lastName' in data) {
return data.lastName
}
}
TypeScript 的型別保護將在每個if代碼塊中為您提供正確的型別。
你也可以查看這個Playground 演示,看看它的實際效果。
uj5u.com熱心網友回復:
我會這樣做:在您的函式中使用另一個 arg 以添加更多型別保護 cf。https://www.typescriptlang.org/docs/handbook/2/keyof-types.html
type TdataV1 = {
firstName: string;
};
type TdataV2 = {
lastName: string;
};
const dataV1: TdataV1 = {
firstName: 'Name',
};
const dataV2: TdataV2 = {
lastName: 'Name',
};
const getKeyProperty = <T>(data: T, key: keyof T) => {
if (data[key]) return data[key];
};
getKeyProperty<TdataV1>(dataV1, 'firstName');
getKeyProperty<TdataV2>(dataV2, 'lastName');
uj5u.com熱心網友回復:
由于您說不想列出所有可能的型別,因此似乎不需要泛型。你可以做這樣的事情:
const getProperty = (data: { [key: string]: string }): string => {
if (data.firstName) {
return data.firstName
}
if (data.lastName) {
return data.lastName
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317142.html
