Typescript 错误TS2339:What';使用Array和ReadonlyArray有什么区别?
有人能为下面的用例解释一下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
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()];
}