Скажем, у меня есть такая структура:
type Dict<T = any> = {[key: string]: T}
type AsObject<T extends Dict> = {
[K in keyof T]: (x: any) => T[K]
}
Что мне нужно, так это та же структура, что и массив, но как зафиксировать тип для этого конкретного ключа в функции?
type AsArray<T extends Dict> = {
key: keyof T
fn: (x: any) => T[??] // how to get typeof key from here ?
}[]
Не могли бы вы объяснить лучше, что вы подразумеваете под функцией ключа? Как в ключе в возврате объекта этой функции? так как функции в отличие от объектов не имеют ключей
@AliHabibzadeh Я указываю ключом конкретный ключ в объекте, содержащем функцию (в AsObject)
Если вы хотите, чтобы элементы массива имели правильную комбинацию type
и fn
, вы можете, используя отображаемый тип, создать объединение всех допустимых возможностей для элемента массива, а затем использовать это для определения массива:
type Dict<T = any> = Record<string, T>
type AllPosibilities<T extends Dict> = {
[K in keyof T]: {
type: K,
fn: (x: any) => T[K]
}
}[keyof T]
type AsArray<T extends Dict> = AllPosibilities<T>[]
let arr : AsArray <{
"a": string,
"b": number
}> = [
{ type: "a", fn: (x) => "" }, //ok
{ type: "b", fn: (x) => "" },// err
{ type: "b", fn: (x) => 1 } //ok
]
Record<T>
— это существующий тип, который охватывает то, что делает ваш тип Dict.