首页 > 解决方案 > 函数不返回嵌套 keyof 的值

问题描述

我正在尝试从模型级别之一返回值。第一级效果很好,因为返回值的类型是 T[K],这意味着 ['Login', 'Password', 'Address'] 返回我想要的。但是当我更改 getProperty(auth, x => x.Address);getProperty(auth, x => x.Address.Address2);. 我知道 'Address2' 属性不直接在 T 类型下。而且我不知道什么类型的更改 'T[K]' 也可以与 ie 一起使用。地址 2 属性。你可以帮帮我吗?

编辑:有什么奇怪的getProperty(auth, x => x.Address.Address2.State);作品

export interface Auth {
  Login: string;
  Password: string;
  Address: {
      Address2: {
        State: string;
      }
  }
}

let auth: Auth = {
    Login: 'login',
    Password: 'password',
    Address: {
        Address2:{
            State: 'some state'
        }
    }
  };


function getProperty<T, K extends keyof T>(obj: T, fn: (m: T) => T[K]) {
    console.log(fn(obj));
}

getProperty(auth, x => x.Address.Address2);

标签: typescript

解决方案


function getProperty<T, B>(obj: T, fn: (m: T) => B): B {
   return fn(obj);
}

const testType = getProperty(auth, x => x.Address.Address2); // string.

希望这会有所帮助,据我所知,没有办法对你的函数返回一个由 T 索引产生的类型这一事实进行深度类型,因为没有办法表达这种“深度”。IE 你可以表达 T[K] 但深度只能为 1。可以键入“完全表达深度密钥访问”的另一种语法是这样的......

interface IGetProperty<Original, Access> {
    value: Access,
    pick: <K extends keyof Access>(key: K) => IGetProperty<Original, Access[K]>
}

const getProperty = <Original, Access = Original>(obj: Original): IGetProperty<Original, Access> => {
   return {
       value: obj as any,
       pick: (key) => getProperty((obj as any)[key as any]) as any
   }
}

const testType = getProperty(auth).pick("Address").pick("Address2").pick("State").value // string.
const testType = getProperty(auth).pick("Address").pick("Invalid Key").pick("State").value // Error.

编辑:在打字稿中,即使您可以键入一个函数来返回 T[K] 也不会“强制”该函数返回从“T”索引的某个值,因为如果 T[K] 是字符串,那么您可以返回任何字符串,例如不是来自“T”的“hello”,它仍然会进行类型检查,这是因为 Typescript 类型的东西在结构上不是名义上的,如果你是 T[K] 的类型是全局唯一的,这种行为是可能的


推荐阅读