typescript - 函数不返回嵌套 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);
解决方案
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] 的类型是全局唯一的,这种行为是可能的
推荐阅读
- java - Jsoup 获取元素旁边的数据
- ruby-on-rails - Rails ActiveStorage - 上传的图像在 5 分钟后抛出错误 400
- ssl - 无法将 Filebeat 连接到 Logstash
- office-js - 新的 Microsoft Word office 加载项未在功能区中显示加载项按钮
- c++ - 在编译时知道是什么意思?常量表达式
- javascript - jQuery不同的背景滑块在不同的部分
- google-bigquery - 我可以将 CSV 添加到没有架构的现有 BiqQuery 表吗?
- reactjs - “错误:在 react-redux 项目中安装节点包时找不到模块'internal/util/types'”
- regex - 如何创建一个不匹配带有子字符串“ac”但末尾可以有“ac”的行的正则表达式?
- gnu-parallel - 远程 GNU 并行作业获取“/bin/bash: Permission denied”