ts 使用规范 --> 消除警告?

image.png
这样排除 get 为什么不行呢?如何修改?

阅读 2.9k
4 个回答

一种简单的方案是使用 any

interface ID {
  add(): number
  [key: string]: any
}

如果无法接受,那就将化解类型冲突:

注意,下面的写法应该不会这么麻烦,但是我不知道如何声明一个联合函数的类型。
function add() {
  return 0;
}

interface ID {
  add(): number;
  [key: string]: number | typeof add;
}

若是依然不合适的话,那就需要根据使用场景进行调整了。


更新:

type A = (dom: HTMLElement) => number;

interface IDL {
  add: A;
  [key: Exclude<string, 'get'>]: number | A;
}

更新二:

你要先了解一点,就是为什么会报错,这里放一个简单的例子来说:

// Error
interface T {
  a: number;
  [k: string]: string;
}

为什么这个接口 T 会报错?因为 a[k] 不兼容,两者的返回值不一样。

[k: string]: string 所做的,就是列举所有 string 类型的 key,它们的返回值是 string,然而此时 typeof a === 'string',其 返回值却是 number,所以不成立。

回到你的场景,不要看都是 number 结尾,对于 get 来说,它的名是 string,但值是一个 function

如果你需要兼容,那么可以将 get 或者 [k] 设置为 anynever(前文已提供)。

不然在表现上,就很矛盾了:

type T = string & number;

题外话:Map 泛型较为灵活,当然必要的判断少不了。

function get(dom: HTMLElement): number {
  return 0;
}

const map = new Map<string, number | typeof get>();

改用 type

type IDL = Record<string, number> & { get(dom: HTMLElement): number };
interface ID {
  [key: string]: number | Function;
  add(): number;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏