如何只接受 ArrayBuffer 作为参数

How to only accept ArrayBuffer as parameter

我有一个 class,它在构造函数中接受数组缓冲区参数,如下所示:

class Test {
    public constructor(buffer: ArrayBuffer) {
        ...
    }
}

问题是 ArrayBuffer 类型是一个非常小的接口,它也意外匹配类型化数组(不是数组缓冲区)。所以我的 class 也可以用类型化数组作为参数来构造。所以这两个调用对编译器都是有效的:

new Test(new Float32Array([ 1, 2, 3, 4 ]).buffer);  // <-- Correct usage
new Test(new Float32Array([ 1, 2, 3, 4 ]));         // <-- Wrong usage

为了防止以错误的方式使用我的 API,我希望编译器拒绝将类型化数组传递给构造函数。任何人都知道一个很好的小技巧如何实现这一点?

没关系,已找到解决方案:

type StrictArrayBuffer = ArrayBuffer & { buffer?: undefined };

它匹配一个真正的 ArrayBuffer 因为它没有 buffer 属性 并且它不匹配一个类型化的数组因为这个类型有一个 buffer 属性 与类型 undefined.

不匹配