我有这个:
interface Obj {
foo: string,
bar: number,
baz: boolean
}
所需的类型是该元组:
[string, number, boolean]
如何将接口转换为元组?
更新:
我最初的问题是:我以声明性的精神构建了一些自以为是的库,用户应在其中使用对象文字描述函数的参数。像这样:
let paramsDeclaration = {
param1: {
value: REQUIRED<string>(),
shape: (v) => typeof v === 'string' && v.length < 10
},
param2: {
value: OPTIONAL<number>(),
...
},
}
然后,库将使用该对象并使用其参数创建一个函数:
(param1: string, param2?: number) => ...
因此,实现这样的功能不是问题,问题在于正确键入它,以便用户获得良好的代码完成(IntelliSense)。
PS:我知道这是无法解决的,但是知道什么是最可能的解决方法/黑客,这将很有趣。
这并不是一个真正的问题的答案,但是由于我实际上并不认为有可能这样做,因此希望这至少在某种程度上有所帮助:
function REQUIRED<T>(): T {
//...
}
function OPTIONAL<T>(): T {
//...
}
interface ParamsDeclaration {
readonly [paramName: string]: {
readonly value: any;
readonly shape?: Function;
};
}
type Func<T> = T extends {
readonly [paramName: string]: {
readonly value: infer U;
};
} ? (...params: Array<U>) => void
: never;
function create<T extends ParamsDeclaration>(paramsDeclaration: T): Func<T> {
// ...
}
const paramsDeclaration = {
param1: {
value: REQUIRED<string>(),
shape: (v: any) => typeof v === 'string' && v.length < 10
},
param2: {
value: OPTIONAL<number>(),
//...
},
};
// Type is '(...params: (string | number)[]) => void'
const func1 = create(paramsDeclaration);
func1('1', 2); // Ok
func1(2, '1'); // Ok, but I assume not what you want
func1(Symbol()); // TS error
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句