如何讓 Typescript 了解物件的值型別,而不會失去對其靜態宣告的關鍵資訊的訪問權限?
在下面的代碼中,我想要
- TS 知道值的型別,在這種情況下是一個函式,所以我不必每次都指定它的簽名。
- TS 從靜態宣告中知道物件的鍵,因此我可以從其他地方以型別安全的方式參考它們
這個物件是同質的,并且會有很多功能,每次都指定簽名似乎很痛苦。
示例 1 - TS 不知道物件的鍵
interface Foo {
[key: string]: (n: number) => any
}
const obj1: Foo = {
// TS already knows that `n` is a number ??
bar(n) {return n}
}
type KeyOfObj1 = keyof typeof obj1
const kob1: KeyOfObj1 = "xyz" // This does not fail static type checking ??
示例 2 - TS 不知道作為物件值的函式的簽名
const obj2 = {
// Notice here I have to specify the type of `n` ??
bar(n: number) {return n}
}
type KeyOfObj2 = keyof typeof obj2
const kob2: KeyOfObj2 = "xyz" // This fails static type checking ??
我怎樣才能兩全其美?
ps 我知道我可以把鑰匙拉到一個列舉中,但這看起來相當丑陋和重復,雖然也許它真的是唯一的方法??
uj5u.com熱心網友回復:
這是一種相當常見的情況:您想撰寫一個物件,根據某些較弱的型別(Foo在本例中)對其成員進行背景關系型別化,但仍為其他目的保留較強的型別(在本例中,您不希望“忘記”鍵是什么)。
通常要做的是撰寫一個通用標識函式,如下所示,它檢查引數型別T是否是 的子型別Foo,同時回傳更嚴格的型別T:
function foo<T extends Foo>(obj: T): T {
return obj;
}
然后,當您創建物件時,編譯器將根據背景關系鍵入它,就好像它是 的某個子型別一樣Foo,但仍保留該子型別(及其特定的鍵名)以分配給obj:
const obj = foo({
foo(n) { return n 1; },
bar(n) { return n * 2; },
});
// 'foo' | 'bar'
type ObjKeys = keyof typeof obj
游樂場鏈接
不幸的是,至少現在,您確實需要通用標識函式才能使其作業。目前有一項提議為語言添加新語法,這樣就可以解決此類問題,而無需添加“無用”的額外功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436904.html
標籤:打字稿
