我设置了以下接口和对象:
interface ServicesList {
[key: string]: Service;
}
interface Service {
uuid: string;
characteristics: CharacteristictList;
}
interface CharacteristictList {
[key: string]: string;
}
const ServiceAndCharacteristicMap: ServicesList = {
firstService: {
uuid: '0x100',
characteristics: {
characteristicOne: '0x0101',
},
},
secondService: {
uuid: '0x200',
characteristics: {
secondCharacteristic: '0x0201'
}
}
};
然后,我定义了以下函数:
function sendCharacteristic<T extends Service, K extends keyof T['characteristics']>(props: {
service: T;
characteristic: K;
}) {
console.log(props.service.uuid,
props.service.characteristics[props.characteristic])
}
目前,TypeScript通过以下编译时错误对此进行了抱怨:
类型“K”不能用于索引类型“CharacteristictList”
我的目标是约束第二个参数(
characteristic
)这样我就有了我使用的钥匙的打字安全。例如,以下操作应该成功:
sendCharacteristic({
service: ServiceAndCharacteristicMap.firstService,
characteristic: 'characteristicOne'
});
但是,这应该会失败,因为
characteristicOne
属于
firstService
我路过
secondService
对于第一个参数:
sendCharacteristic({
service: ServiceAndCharacteristicMap.secondService,
characteristic: 'characteristicOne'
});
目前
sendCharacteristic
抱怨编译错误。
如何正确约束
特征
参数,以便获得的特定实例的类型安全性
Service
我路过?
TypeScript playground with all included code