【发布时间】:2020-12-20 02:03:49
【问题描述】:
目标
注意用助手类/函数替换isInvalid: false 和validationPending: false:
const controlsAccess: {
senderName: ControlAccess<string>;
senderPhoneNumber: ControlAccess<number>;
senderAddress: ControlAccess<Address>
} = {
senderName: {
validatablePayload: {
value: "",
isInvalid: false,
validationPending: false
},
vueReferenceID: "SENDER_NAME"
},
senderPhoneNumber: {
validatablePayload: {
value: 0,
isInvalid: false,
validationPending: false
},
vueReferenceID: "SENDER_EMAIL"
},
senderAddress: {
validatablePayload: {
value: { city: "", street: "" },
isInvalid: false,
validationPending: false
},
vueReferenceID: "SENDER_ADDRESS"
}
};
类型:
type ValidatableVModel<Value> = {
isInvalid: boolean;
value: Value;
validationPending: boolean;
};
type ControlAccess<ValidatablePayload> = {
validatablePayload: ValidatableVModel<ValidatablePayload>;
vueReferenceID: string;
};
type Address = {
city: string;
street: string;
}
最终的语法如下:
const controlsAccess: {
senderName: ControlAccess<string>;
senderPhoneNumber: ControlAccess<number>;
senderAddress: ControlAccess<Address>
} = generateControlAccessObject({
senderName: { vueReferenceID: "SENDER_NAME", initialValue: "" },
senderPhoneNumber: { vueReferenceID: "SENDER_NAME", initialValue: 0 },
senderAddress: { vueReferenceID: "SENDER_ADDRESS", initialValue: { city: "", street: "" } }
})
JavaScript 解决方案很简单:
function generateControlAccessObject(dynamicData) {
const accumulatingResult = {};
for (const [ key, data ] of Object.entries(dynamicData)) {
accumulatingResult[key] = {
validatablePayload: {
value: data.initialValue,
isInvalid: false,
validationPending: false
},
vueReferenceID: data.vueReferenceID
}
}
return accumulatingResult;
}
console.log(generateControlAccessObject({
senderName: { vueReferenceID: "SENDER_NAME", initialValue: "" },
senderPhoneNumber: { vueReferenceID: "SENDER_NAME", initialValue: 0 },
senderAddress: { vueReferenceID: "SENDER_ADDRESS", initialValue: { city: "", street: "", } },
}))
现在如何解释 TypeScript 的参数是什么,返回什么?
概念层面的解决方案
让 TypeScript 知道隐含的键和类型关系:
- 发件人姓名:
string - 发件人电话号码:
number - 发件人地址:
Address
我的努力
首先controlsAccess__updatedAPI的类型和generateInputsAccessObject返回的类型不兼容。接下来,accumulatingResult 最初为空,与类型注释不匹配。最后,TypeScript 目前还不知道data 里面是什么。
const controlsAccess__updatedAPI: {
senderName: ControlAccess<string>;
senderPhoneNumber: ControlAccess<number>;
senderAddress: ControlAccess<Address>
} = generateInputsAccessObject({
senderName: { vueReferenceID: "SENDER_NAME", initialValue: "" },
senderPhoneNumber: { vueReferenceID: "SENDER_NAME", initialValue: 0 },
senderAddress: { vueReferenceID: "SENDER_ADDRESS", initialValue: { city: "", street: "", } },
})
type DynamicData<Keys extends string, Values> = Record<Keys, SingleControlDynamicData<Values>>;
type SingleControlDynamicData<Values> = { initialValue: Values; vueReferenceID: string; };
function generateInputsAccessObject<Keys extends string, Values>(
dynamicData: DynamicData<Keys, Values>
): Record<Keys, { initialValue: Values; vueReferenceID: string; }> {
const accumulatingResult: Record<Keys, { initialValue: string; vueReferenceID: string; }> = {};
for (const [ key, data ] of Object.entries(dynamicData)) {
accumulatingResult[key] = {
validatablePayload: {
value: data.initialValue,
isInvalid: false,
validationPending: false
},
vueReferenceID: data.vueReferenceID
};
}
return accumulatingResult;
}
要求
- 请不要跳过类型注释
- 请不要
any和object
【问题讨论】:
-
通过简化您的问题,您将增加获得答案的机会
-
@captain-yossarian,谢谢你的推荐。请您澄清一下哪一部分是不必要的?
标签: typescript