2024年4月18日 星期四

typescript中的map,How to get types from arrays

前言

我們都知道要把自定義物件轉成型別在ts裡面要使用typeof,

const config = {
"self": {
"method": "get",
"uri": "self"
},
"login": {
"method": "post",
"uri": "backend/login"
},
"logout": {
"method": "get",
"uri": "logout"
}
}
const keys = keyof type config // "self" | "login" | "logout"

但假設今天是一個陣列,例如

const datas = [
{
"key": "collect",
"value": "Collect"
},
{
"key": "ffc",
"value": "FFC"
},{
"key": "switch",
"value": "Switch"
},
]

那我要把所有的key取出來變成類別該怎麼寫呢,總不能真的用js的map吧,實際上就是,你上網找ts map也只會找到集合的Map,所以該怎麼寫呢,我們直接看code

let key = (typeof datas)[number]["key"]

沒錯,就是這麼簡單,最後你就會發現key的類別是string.....那我幹嘛這麼大費周章,寫這麽多字只為了宣告string!!

先別急,我們要再做一點調整,不過不是類別宣告,而是資料

const datas = [
{
key: "collect",
value: "Collect",
},
{
key: "ffc",
value: "FFC",
},
{
key: "switch",
value: "Switch",
},
] as const
let key = (typeof datas)[number]["key"] // "collect" | "ffc" | "switch"

加上一個 as const資料就會被定型,在取用key時就可以取道固定的值了。

不過const資料之後,或許還是會產生其他的問題,例如realonly {...}不符合Rcord<string, any>之類的,這些問題......改天再說吧!以上,下班!

參考網站


沒有留言:

張貼留言