强制执行toString的类型签名

时间:2017-05-03 04:41:29

标签: typescript

如何强制编译器不重载toString?我得到的最接近的是使用never类型,但仍然允许永远不允许将其隐式分配给var,编译器只有在对变量执行某些操作时才会抱怨。谁会记得将toString调用显式声明为字符串?

type ArrayToStringMethod = {
  (this: { join(a: string): string, length: number }): string
  (this: any): never // if this overload isn't here typescript uses 
                     // Object.toString automatically.
}

type ArrayDontMutate<t> = {
    toString: ArrayToStringMethod
    readonly [index: number]: t
    readonly length: number
} &
Pick<
  Array<t>, 
  'find'   |
  'map'    |
//'join'   | deliberately removed to make toString fail
  'some'   |
  'slice'  |
  'concat' |
  'reduce'>

let a:ArrayDontMutate<string> =['a','b','c'] as any
let b = a.toString() //should fail no join method. b is the never type

1 个答案:

答案 0 :(得分:2)

  

如何强制编译器不要重载toString

lib.d.ts类型定义中有一些本机接口可以驱动类型检查器的工作方式。其中一个是Object接口,此接口具有toString方法。

如果您想禁止toString,可以使用--noLib并创建一个没有此方法的lib.d.ts副本。

更多