小天管理 发表于 2024年9月2日 发表于 2024年9月2日 服了 TypeScript 这货了,符合我对微软的刻板印象,最近几年似乎每次碰到看不明白的语法出错,都是在 TypeScript ,这货无数细节太微妙了。 interface Elements { div: { id: number; name?: string; color: string; x: string } a: { id: number; name?: string; href: string; x: string } } declare function getProps<T extends Record<any, any>>(obj: T, keys: (keyof T)[]): void function Foo<T extends 'div' | 'a'>(tag: T, props: Omit<Elements[T], 'x'>) { // 这行报错 Type 'string' is not assignable to type 'Exclude<keyof Elements[T], "x">' getProps(props, ['id']) } Foo('a', { id: 1, href: '#' }) // 我以为是因为 Omit 只能放单个对象,试了下多个也行啊。 type kkk = Omit<Elements['div' | 'a'], 'x'> 把 `function Foo<T extends 'div' | 'a'>(tag: T, props: Omit<Elements[T], 'x'>)` 改成 `function Foo<T extends 'div' | 'a'>(tag: T, props: Omit<Elements['div' | 'a'], 'x'>)` 就不会报错。 那这个 `T` 不就是 `'div' | 'a'` 吗?这 tm 二者到底有什么微妙区别导致代码一个报错一个没错?
已推荐帖子