Typescript,如何从另一个属性值推断类型?

时间:2020-07-31 06:01:45

标签: typescript

例如,我有一个属性为keyvalue的接口,我想通过键来推断值类型。

interface Obj { a: number; b: string }

interface Param<K extends keyof Obj> {
  key: K
  value: Obj[K] // I want to infer this type
}

const p: Param<keyof Obj> = {
  key: 'a',
  value: '', // typescript can't infer this type, expect number
}

我该怎么做?

1 个答案:

答案 0 :(得分:3)

import * as React from 'react'; import { Text, View } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs'; import StateConsumptions from './StateConsumptions'; import StateTemperatures from './StateTemperatures'; const Tab = createMaterialTopTabNavigator(); export default function App() { return ( <NavigationContainer> <Tab.Navigator> <Tab.Screen name="Температуры" component={StateConsumptions} /> <Tab.Screen name="Давление" component={StateTemperatures} /> </Tab.Navigator> </NavigationContainer> ); } 表示可以通过Obj[K]中的任何值而不是Obj索引K来获得的值。

因此,要使用此结构,您需要指定更紧密使用哪个键:

key

可悲的是,无法推断出通用参数。


如果您已经知道interface Obj { a: number; b: string } interface Param<K extends keyof Obj> { key: K value: Obj[K] } const p: Param<'a'> = { // changed line key: 'a', value: '', // error } 中的内容,那么可能会有更好的方法。

Obj

这是唯一的方法,如果您需要变量interface AParam { key: 'a' value: number } interface BParam { key: 'b' value: string } type Param = AParam | BParam; const p: Param = { key: 'a', value: '', // error } 来容纳p中的任何一个,但仍将key设置为正确的类型,那么它将是唯一的方法。