type ITrack<T extends Record<any, (...args: any[]) => void>> = (trackName: keyof T, ...args: Parameters<T[keyof T]>) => void;
interface ITrackMethods {
trackA: (data: { a: string }, options: { force?: boolean }) => void;
trackB: (data: { b: number }) => void;
}
export const track: ITrack<ITrackMethods> = (trackName, trackData) => {
if (trackName === 'trackA') {
// 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackA']>[0]
console.log(trackData.a);
} else if (trackName === 'trackB') {
// 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackB']>[0]
console.log(trackData.b)
}
};
希望能够实现一个工具类型 ITrack,入参之间存在类型约束,可自动推导出类型。
但是上方实现由多处报错。
interface ITrackMethods {
trackA: (data: { a: string }, options: { force?: boolean }) => void;
trackB: (data: { b: number }) => void;
}
type ITrackParams<T> = {
[K in keyof T]: T[K] extends (...args: any) => void ? [key: K, ...args: Parameters<T[K]>] : never
}[keyof T]
const track = ([trackName, trackData]: ITrackParams<ITrackMethods>) => {
if (trackName === 'trackA') {
// string
console.log(trackData.a);
} else if (trackName === 'trackB') {
// number
console.log(trackData.b)
}
};
合在一起才好收窄类型
type Magic<T, K = keyof T> = K extends keyof T ? T[K] extends (...args: any[]) => void ? {
trackName: K;
trackData: Parameters<T[K]>[0];
} : never : never
export const track = ({ trackData, trackName }: Magic<ITrackMethods>) => {
if (trackName === 'trackA') {
// 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackA']>[0]
console.log(trackData.a);
} else if (trackName === 'trackB') {
// 希望这里 trackData 的类型为 Parameters<ITrackMethods['trackB']>[0]
console.log(trackData.b)
}
};
本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。
我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出
所以我试图写一个函数,它有一个泛型,它扩展了一个特定的对象,从而约束了它。接下来,我想将这个泛型与参数的定义一起使用,以生成一个新的“增强”参数。这一切都很好,但一旦我想引入一个默认值的参数TypeScript抱怨如下消息(这在操场上的一些不同的变化): 功能: 错误: 类型“{foo:string;}”不可分配给类型“T” 编译器警告我,我可能想使用foo,实际上我做到了。是简单地不可能以这种方
假设我有一个类模板,
此模式抛出TypeScript错误: 类型为“(string | number)[]”的参数不能分配给类型为“string[]| number[]”的参数 我理解这是因为TypeScript编译器会将其视为字符串和数字混合的数组。 是否有一种类型安全的方法来实现这一点?我只能想投给任何感觉不好的[]:
我有一个Oracle表,它有10列-col1、col2、COL3...COL10。我的要求是-对于col1、col2、col3的唯一值集,即(col1、col2、col3)只允许col4的唯一值,即使它是多次。例如:如果有10行COL1=3,COL2='A005',COL3=10,则所有10行的col4值应相同。 我如何在Oracle中放置此限制?