TypeScript:读取对象中值的通用类型

标签 typescript generics typescript-typings typescript-generics

我有这个界面:

interface Api {
  state: Converter<State>;
  water: Converter<Water>;
  version: Converter<Versions>;
}

我有一个名为 write 的函数

write(name, value);

现在我想要实现的是 value 的类型根据第一个参数( name ),应该是 Converter 的泛型。

所以如果我调用 write("state", value) -> value应该是 State . "water"也是如此和 "version" .

write("state, value);    // value should be type of State
write("water", value);   // value should be type of Water
write("version", value); // value should be type of Versions

我这样实现了第一个参数:

write(name: keyof Api, value: ???)

我发现我可以得到对应的值到keyof Api像这样:

write<K extends keyof Api>(name: K, value: Api[K])

但这给了我 Converter<State>对于 "state" .有没有一种方法可以访问 Converter 中的泛型? ?

最佳答案

如果您有权访问 Converter iterface/type 或使用此类型扩展它的其他内容

或者像这样创建扩展接口(interface)

interface Converter<T> {
  p1: any;
  p2: any;
}
interface IExtendedConverter<T> extends Converter<T> {
  type: T;
}

interface IApi {
  state: IExtendedConverter<string>;
  water: IExtendedConverter<number>;
}

const write = <K extends keyof IApi>(name: K, value: IApi[K]['type']) => {
  return;
};

const str = write('state', '1'); // here value has to be string
const num = write('water', 1); // here value has to be number

根据问题编辑

一个解决方案是定义这个参数

const extendedConverterState: IExtendedConverter<string> = {
  ...converter,
  type: '',
};

const extendedConverterNumber: IExtendedConverter<number> = {
  ...converter,
  type: 1,
};

const api: IApi = {
  state: extendedConverterState,
  water: extendedConverterNumber,
};

这在某种程度上是迟钝的解决方案,因为您只会创建永远不会被使用的属性。

其他解决方案可以是将类型参数创建为 optionla

interface IExtendedConverter<T> extends Converter<T> {
  type?: T;
}

但是这个 souliton 会把你在写函数中的参数设置为可选(可能未定义)

也许有更好的解决方案来访问这个通用类型。 idk

关于TypeScript:读取对象中值的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663663/

相关文章:

reactjs - 如何在 React/TypeScript 中将接口(interface)作为 prop 传递?

java - 如何将泛型接口(interface)实现为非泛型类 Java

java - 使用泛型返回多个类型

javascript - 由于没有从 express-serve-static-core 导出 ParsedQs,构建失败

javascript - Typescript中如何使用es6语法导入功能模块

css - Angular 单元测试-使用Enter键触发ngSubmit失败

reactjs - 'HTMLElement | null' 类型的参数不能分配给 'Element' 类型的参数。类型 'null' 不可分配给类型 'Element' .ts(2345)

java - 如何基于列表的最后一个节点(未知类型)创建对象并添加到列表的最后一个?

javascript - 如何在具有默认导出的 TypeScript 类型中描述 JavaScript 类静态工厂方法?

typescript :如何合并这个交叉点的表示(在工具提示中)?