如何只接受 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
.
不匹配
我有一个 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
.