【发布时间】:2019-03-09 19:06:14
【问题描述】:
我正在将 Javascript 应用程序移植到 Typescript。 我有一个具有许多包含数据的数组属性的对象,并且一个 javscript 函数可以访问数据数组。为简单起见,我只考虑 add 方法
function updateDataStructure(state, structureName, elem) {
state.data[structureName].push(elem);
return state.data[structureName];
}
移植到打字稿我想介绍类型安全并维护通用代码。
interface AA {
lep: string,
snap: number,
sul: boolean
}
interface BB {
p1: string;
val: number;
}
interface StateDataContainer {
aa: AA[],
bb: BB[],
}
class State {
data: StateDataContainer;
}
export type DataContainerProps = keyof StateDataContainer;
type ArrayElement<ArrayType> = ArrayType extends (infer ElementType)[] ? ElementType : never;
function updateDataStructure<K extends DataContainerProps, D extends ArrayElement<StateDataContainer[K]>>
(state: State, structureName: K, elem: D)
: StateDataContainer[K] {
// @ts-ignore
state.data[structureName].push(elem);
return state.data[structureName];
}
使用这段代码,我有一个类型化的安全接口,编译器检查客户端代码以将正确的对象添加到正确的结构中。
const state = new State();
let avv: BB;
let line: AA;
let v: BB[] = updateDataStructure(state, 'bb', avv!);
let l: AA[] = updateDataStructure(state, 'aa', line!);
使用此解决方案,我必须在实现代码中添加使用 //@ts-ignore 注释以避免编译器错误,例如:
Argument of type 'D' is not assignable to parameter of type 'AA & BB'.
Type 'ArrayElement<StateDataContainer[K]>' is not assignable to type 'AA & BB'.
Type '{}' is not assignable to type 'AA & BB'.
Type '{}' is not assignable to type 'AA'.
Type 'AA | BB' is not assignable to type 'AA & BB'.
有没有更好的方法来编写这段代码?
【问题讨论】:
标签: javascript typescript dynamic types