typescript - Typ Objekt inkluderar sträng?
function isObject(v: any): v is Object{
return v instanceof Object && !Array.isArray(v);
}
let v: string | Object;
if (isObject(v))
v.hasOwnProperty("x");
else
if (typeof v === 'string')
v.trim(); //Error: Property 'trim' does not exist on type 'never'
Jag är förvirrad över det felet på sista raden, uppenbarligen blir v begränsat till typen 'never' men jag kan inte se logiken i det. (Typescript version 4.2.3)
Svar #1
Så här definieras Object-gränssnittet i TypeScript:
interface Object {
constructor: Function;
toString(): string;
toLocaleString(): string;
valueOf(): Object;
hasOwnProperty(v: PropertyKey): boolean;
isPrototypeOf(v: Object): boolean;
propertyIsEnumerable(v: PropertyKey): boolean;
}
Nästan alla typer, inklusive primitiva som string, kan tilldelas till Object (ja, string har alla ovanstående egenskaper).
objekt (gemener) är en typ som representerar den icke-primitiva typen, det vill säga allt som inte är number, string, boolean, symbol, null eller undefined
function isObject(v: any): v is object {
return v instanceof Object && !Array.isArray(v);
}
declare let v: string | object;
if (isObject(v))
v.hasOwnProperty("x");
else
v.trim(); // v narrowed to string
Lekplats
Gör och gör inte
Svar #2
let v: string | Object;
När man utför instanceOf (typkontroll) betraktar den variabeln v som typ string eftersom du nämnde string som första typ och Object som andra typ av den variabeln. Så i det här fallet, utan att ha något värde på den variabeln, hur ska instanceOf veta typen? Så den kommer att kontrollera null instanceof Object. Vilket betyder att null inte är av objekttyp. Detta är anledningen till varför isObject() returnerar false. Se
console.log(null instanceof Object)Om du tilldelar något värde, kommer endast instanceOf att betraktas som typen baserat på värdet eftersom den variabeln har två datatyper.
