TypeScript 使用扩展某个东西的泛型参数,在除了keyof和Pick之外还使用Exclude时,停止推断超键,

m1m5dgzv  于 10个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(92)

TypeScript版本: 3.1.0
搜索词:

keyof extends pick exclude

代码

  1. interface Base {
  2. base1: number;
  3. base2: number;
  4. }
  5. class Data<T extends Base> {
  6. alpha(k:keyof Pick<T, Exclude<keyof T, "base1">>) { }
  7. beta(k:keyof Pick<T, keyof T>) { }
  8. }
  9. function wrapped<T extends Base>() {
  10. let d = new Data<T>();
  11. d.alpha("base2"); // Argument of type '"base2"' is not assignable to parameter of type 'Exclude<keyof T, "base1">'.
  12. d.beta("base2"); // works
  13. }

预期行为:

alpha和beta都应该可以工作。

实际行为:

alpha不能工作:'参数类型为"base2"的Argument无法分配给参数类型为'Exclude<keyof T, "base1">'的T。

Playground链接:

Playground链接

相关问题:

smdncfj3

smdncfj31#

关于这个,@weswigham@ahejlsberg 有什么想法吗?

vkc1a9a2

vkc1a9a22#

我不确定,但我认为我在 v3.3.1 中找到了相同的问题。请让我知道我是否错了,我可以打开一个新的问题。这是一个最小的复现,我的实际用例是从嵌套的 react 高阶组件生成的 Exclude<Exclude 类型。

playground

  1. interface Base {
  2. a: number;
  3. b: number;
  4. c: number;
  5. d: number;
  6. e: number;
  7. f: number;
  8. }
  9. type BaseA = Exclude<keyof Base, "a" | "c" | "b" | "d">;
  10. type BaseB = Exclude<Exclude<keyof Base, "a" | "b">, "c" | "d">;
  11. function testingBase(a: BaseA): BaseB {
  12. return a; // works, as expected
  13. }
  14. type A<T> = Exclude<keyof T, "a" | "c" | "b" | "d">;
  15. type B<T> = Exclude<Exclude<keyof T, "a" | "b">, "c" | "d">;
  16. function testing<T>(a: A<T>): B<T> {
  17. return a; // fails unexpectedly with "Type 'Exclude<keyof T, "a" | "b" | "c" | "d">' is not assignable to type 'Exclude<Exclude<keyof T, "a" | "b">, "c" | "d">'."
  18. }
展开查看全部

相关问题