我正在嘗試構建型別和回呼的映射,所以我從這樣的結構開始:
type Instantiable<T = unknown> = new (...args: any[]) => T;
type SingleParamFn<TInput = unknown, TOuput = unknown> = (arg: TInput) => TOuput;
type TypesRecord<T> = { type: Instantiable<T>, callback: SingleParamFn<T> };
type TypesMap = TypesRecord[]; // This is the structure
一個例子:
const myMap: TypesMap = [{ type: Date, callback: (value) => 'this is a Date' }];
這似乎按預期作業,但我意識到這有點低效,因為您需要回圈陣列以找到所需的型別。
我開始嘗試將型別作為物件鍵,它似乎至少在 Google Chrome 中有效:
class MyFancyObject {}
class MyOtherObject {}
const map = {
[Date]: () => 'this is a date',
[MyFancyObject]: () => 'this is a fancy object',
[MyOtherObject]: () => 'this is another object'
};
console.log(map[Date]()); // 'this is a date'
console.log(map[MyFancyObject]()); // 'this is a fancy object'
console.log(map[MyOtherObject]()); // 'this is another object'
const obj = new MyFancyObject();
console.log(map[obj.constructor]()); // 'this is a fancy object'
console.log(map[(new Date()).constructor]()); // 'this is a date'
我一直在檢查一些檔案,似乎物件的鍵只能是字串或符號,所以我檢查了符號的構成,它似乎有點模糊,因為它被定義為建構式回傳的內置物件保證唯一的符號原語,并且物件的建構式(據我所知)是唯一的。
鑒于所有這些,使用建構式作為物件鍵是一種可靠的方法嗎?如果是這樣,我該如何定義此類物件的打字稿型別?如果不是,是否還有其他選項(如Map物件)?
uj5u.com熱心網友回復:
鑒于所有這些,使用建構式作為物件鍵是一種可靠的方法嗎?
不,正如您所說,物件的鍵只能是字串或符號。Symbol 是您從Symbol(對于眾所周知的、規范定義的符號)的屬性或通過呼叫Symbol()or獲得的原語Symbol.for("...")。建構式不是符號,它們是函式。
您的map物件的鍵是字串。當您使用計算屬性名稱[MyFancyObject]時,如果您提供的值不是字串或符號(在您的情況下,它是一個函式),它會像您一樣隱式轉換為字串String(MyFancyObject)。你可以在這里看到:
class MyFancyObject {}
class MyOtherObject {}
const map = {
[Date]: () => 'this is a date',
[MyFancyObject]: () => 'this is a fancy object',
[MyOtherObject]: () => 'this is another object'
};
console.log(Object.keys(map));
console.log(map[MyFancyObject]()); // "this is a fancy object"
console.log(map["class MyFancyObject {}"]()); // also "this is a fancy object"
如您所見,您想到的鍵MyFancyObject實際上是 string "class MyFancyObject {}"。
但是,您可以將建構式用作 a 中的鍵Map:
class MyFancyObject {}
class MyOtherObject {}
const map = new Map([
[Date, () => 'this is a date'],
[MyFancyObject, () => 'this is a fancy object'],
[MyOtherObject, () => 'this is another object'],
]);
console.log(map.get(MyFancyObject)());
在那里,鍵實際上是建構式,而不是從它們派生的字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/477933.html
標籤:javascript 打字稿 字典
上一篇:如何將字串陣列轉換為數字陣列?
