zsqk / news

每日新闻.
https://zsqk.github.io/news/
MIT License
10 stars 1 forks source link

备稿计划: 为什么 TS 要求 ArrayBuffer 类型, 却允许传入 Uint8Array 类型 #128

Open iugo opened 1 year ago

iugo commented 1 year ago
// 有一个函数, 要求参数为 ArrayBuffer 类型
function test(v: ArrayBuffer) {
    console.log(v, v instanceof ArrayBuffer);
}
const ab = new ArrayBuffer(4);
test(ab);

const u8 = new Uint8Array([1, 2]);
test(u8); // 要求 ArrayBuffer 类型, 但也允许 Uint8Array 类型?

const u32 = new Uint32Array([1, 2]);
test(u32); // 要求 ArrayBuffer 类型, 但也允许 Uint32Array 类型?

为什么允许, 因为如果传入 Uint8Array, 一定能获取到其 ArrayBuffer.

传入 Uint32Array 也可以, 不只是它们, 所有 TypedArray 都有一个 buffer 属性, 指向一个 ArrayBuffer 类型的数据.

不过 TypedArray 不是一个可以直接使用的对象, 但它真的存在, 比如通过 Object.getPrototypeOf(Uint8Array) 可以看到.