例如,我有一个属性为key
和value
的接口,我想通过键来推断值类型。
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
}
我该怎么做?
答案 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
设置为正确的类型,那么它将是唯一的方法。