2017-05-03 158 views
1

如何强制编译器不重载toString?我得到的最接近的是使用never类型,但从来没有被允许隐式赋值给var,编译器只会在变量完成某些操作时发出抱怨。谁会记得显式声明toString调用为字符串?为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 

回答

2

我怎么强制编译器不超载的toString

有该驱动器类型如何检查作品lib.d.ts类型定义原生接口。其中之一是Object接口,此接口有toString方法。

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

更多