如何检查对象是否是 TypeScript 中的只读数组?
How to check if an object is a readonly array in TypeScript?
如何使用只读数组 (ReadonlyArray
) 进行数组检查(如 Array.isArray()
)?
举个例子:
type ReadonlyArrayTest = ReadonlyArray<string> | string | undefined;
let readonlyArrayTest: ReadonlyArrayTest;
if (readonlyArrayTest && !Array.isArray(readonlyArrayTest)) {
// Here I expect `readonlyArrayTest` to be a string
// but the TypeScript compiler thinks it's following:
// let readonlyArrayTest: string | readonly string[]
}
对于通常的数组,TypeScript 编译器正确识别它必须是 if 条件内的字符串。
Here's 打字稿中的相关问题。
@jcalz 建议的解决方法是在 isArray
的声明中添加重载:
declare global {
interface ArrayConstructor {
isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>
}
}
应该是这样的
interface ArrayConstructor {
isArray(arg: unknown): arg is unknown[] | readonly unknown[];
}
并在打字稿中进行测试
const a = ['a', 'b', 'c'];
if (Array.isArray(a)) {
console.log(a); // a is string[]
} else {
console.log(a); // a is never
}
const b: readonly string[] = ['1', '2', '3']
if (Array.isArray(b)) {
console.log(b); // b is readonly string[]
} else {
console.log(b); // b is never
}
function c(val: string | string[]) {
if (Array.isArray(val)) {
console.log(val); // val is string[]
}
else {
console.log(val); // val is string
}
}
function d(val: string | readonly string[]) {
if (Array.isArray(val)) {
console.log(val); // val is readonly string[]
}
else {
console.log(val); // val is string
}
}
function e(val: string | string[] | readonly string[]) {
if (Array.isArray(val)) {
console.log(val); // val is string[] | readonly string[]
}
else {
console.log(val); // val is string
}
}
如何使用只读数组 (ReadonlyArray
) 进行数组检查(如 Array.isArray()
)?
举个例子:
type ReadonlyArrayTest = ReadonlyArray<string> | string | undefined;
let readonlyArrayTest: ReadonlyArrayTest;
if (readonlyArrayTest && !Array.isArray(readonlyArrayTest)) {
// Here I expect `readonlyArrayTest` to be a string
// but the TypeScript compiler thinks it's following:
// let readonlyArrayTest: string | readonly string[]
}
对于通常的数组,TypeScript 编译器正确识别它必须是 if 条件内的字符串。
Here's 打字稿中的相关问题。
@jcalz 建议的解决方法是在 isArray
的声明中添加重载:
declare global {
interface ArrayConstructor {
isArray(arg: ReadonlyArray<any> | any): arg is ReadonlyArray<any>
}
}
应该是这样的
interface ArrayConstructor {
isArray(arg: unknown): arg is unknown[] | readonly unknown[];
}
并在打字稿中进行测试
const a = ['a', 'b', 'c'];
if (Array.isArray(a)) {
console.log(a); // a is string[]
} else {
console.log(a); // a is never
}
const b: readonly string[] = ['1', '2', '3']
if (Array.isArray(b)) {
console.log(b); // b is readonly string[]
} else {
console.log(b); // b is never
}
function c(val: string | string[]) {
if (Array.isArray(val)) {
console.log(val); // val is string[]
}
else {
console.log(val); // val is string
}
}
function d(val: string | readonly string[]) {
if (Array.isArray(val)) {
console.log(val); // val is readonly string[]
}
else {
console.log(val); // val is string
}
}
function e(val: string | string[] | readonly string[]) {
if (Array.isArray(val)) {
console.log(val); // val is string[] | readonly string[]
}
else {
console.log(val); // val is string
}
}