Typescript 错误TS2339:What';使用Array和ReadonlyArray有什么区别?

Typescript 错误TS2339:What';使用Array和ReadonlyArray有什么区别?,typescript,Typescript,有人能为下面的用例解释一下Array和ReadonlyArray之间的区别吗 阵列工作正常: function example(text: string | string[]): string[] { if (Array.isArray(text)) { return text.map(s => s.trim()); } return [text.trim()]; } 但是ReadOnlyRay抛出ts2339-属性“trim”在类型“string”上不存在| rea

有人能为下面的用例解释一下Array和ReadonlyArray之间的区别吗

阵列工作正常:

function example(text: string | string[]): string[] {
  if (Array.isArray(text)) {
    return text.map(s => s.trim());
  }
  return [text.trim()];
}
但是ReadOnlyRay抛出
ts2339
-
属性“trim”在类型“string”上不存在| readyonly string[]
。为什么?

function example(text: string | ReadonlyArray<string>): string[] {
  if (Array.isArray(text)) {
    return text.map(s => s.trim());
  }
  return [text.trim()];
}
函数示例(文本:string | ReadonlyArray):string[]{
if(Array.isArray(文本)){
返回text.map(s=>s.trim());
}
返回[text.trim()];
}

这是……令人惊讶的行为,而且很有趣。显然,
Array.isArray
不足以让TypeScript将
text
的类型从
string | ReadonlyArray
缩小到
string
,即使它可以缩小
string | string[]
。有关详细信息,请参阅完整的问题线程,但基本上这是因为
Array.isArray
未在
readonly
术语中定义

您可以在您的案例中使用
typeof

function example(text: string | ReadonlyArray<string>): string[] {
  if (typeof text === "string") {
    return [text.trim()];
  }
  return text.map(s => s.trim());
}
这样,您的原始代码就可以正常工作了-

不过,他说,在问题的后面部分

如果我想解决问题,我可能会这样做:

interface ReadonlyArrayConstructor  {
    new(arrayLength?: number): ReadonlyArray<any>;
    new <T>(arrayLength: number): ReadonlyArray<T>;
    new <T>(...items: T[]): ReadonlyArray<T>;
    (arrayLength?: number): ReadonlyArray<any>;
    <T>(arrayLength: number): ReadonlyArray<T>;
    <T>(...items: T[]): ReadonlyArray<T>;
    isArray(arg: any): arg is ReadonlyArray<any>;
    readonly prototype: ReadonlyArray<any>;
}
const ReadonlyArray = Array as ReadonlyArrayConstructor;

这是……令人惊讶的行为,而且很有趣。显然,
Array.isArray
不足以让TypeScript将
text
的类型从
string | ReadonlyArray
缩小到
string
,即使它可以缩小
string | string[]
。有关详细信息,请参阅完整的问题线程,但基本上这是因为
Array.isArray
未在
readonly
术语中定义

您可以在您的案例中使用
typeof

function example(text: string | ReadonlyArray<string>): string[] {
  if (typeof text === "string") {
    return [text.trim()];
  }
  return text.map(s => s.trim());
}
这样,您的原始代码就可以正常工作了-

不过,他说,在问题的后面部分

如果我想解决问题,我可能会这样做:

interface ReadonlyArrayConstructor  {
    new(arrayLength?: number): ReadonlyArray<any>;
    new <T>(arrayLength: number): ReadonlyArray<T>;
    new <T>(...items: T[]): ReadonlyArray<T>;
    (arrayLength?: number): ReadonlyArray<any>;
    <T>(arrayLength: number): ReadonlyArray<T>;
    <T>(...items: T[]): ReadonlyArray<T>;
    isArray(arg: any): arg is ReadonlyArray<any>;
    readonly prototype: ReadonlyArray<any>;
}
const ReadonlyArray = Array as ReadonlyArrayConstructor;

function example(text: string | ReadonlyArray<string>): string[] {
  if (ReadonlyArray.isArray(text)) {
    return text.map(s => s.trim());
  }
  return [text.trim()];
}