export enum SomeKeys {
FIRST_KEY = 'FIRST_KEY',
SECOND_KEY = 'SECOND_KEY',
}
export const DICT: {
[key in SomeKeys]: {
title: string;
greeter: () => {};
};
} = {
[SomeKeys.FIRST_KEY]: {
title: 'first key title',
greeter: (name: string) => ({ name }),
},
[SomeKeys.SECOND_KEY]: {
title: 'second key title',
greeter: (name: string, age: number) => ({
name,
age,
}),
},
};
是否可以使用強型別的“greeter”函式創建這樣的字典?
所以我想將這些值用作:
const { title, greeter } = DICT[SomeKeys.FIRST_KEY];
const { name } = greeter('Adam');
我希望它足夠清楚以了解我的問題是什么??
uj5u.com熱心網友回復:
使用您的顯式鍵入,TypeScript 相信DICT您擁有指定型別的同構鍵;它會洗掉您從常量字典中獲得的型別資訊。如果您洗掉打字,它會起作用。
export const DICT /* typing removed */ = {
[SomeKeys.FIRST_KEY]: {
title: 'first key title',
greeter: (name: string) => ({ name }),
},
[SomeKeys.SECOND_KEY]: {
title: 'second key title',
greeter: (name: string, age: number) => ({
name,
age,
}),
},
};
操場
您可以使用輔助函式做得稍微好一點,該函式將檢查 SomeKeys 的完整性,如果您沒有正確指定預期欄位,則會拋出:
type ExpectedKeyType = {
[key in SomeKeys]: {
title: string;
greeter: unknown;
}
};
function checkKeys<T extends ExpectedKeyType>(t: T) {
return t;
}
export const DICT = checkKeys({
/* snip, same as above */
[SomeKeys.THIRD_KEY]: {
title: 'third key title',
greeter: (age: number) => ({ age }),
},
});
const { title, greeter } = DICT[SomeKeys.THIRD_KEY];
const { age } = greeter(42);
// If you diverge from the value, it won't compile.
export const DICT_WITH_TYPO = checkKeys({
/* snip */
[SomeKeys.THIRD_KEY]: {
title: 'third key title',
egregiousTypo: (age: number) => ({ age }), // error here
},
});
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/372390.html
標籤:打字稿
上一篇:(Angular)為什么你需要同一個服務的多個實體?
下一篇:使用單個變數插入SQLITE
