interface String { startsWith(searchString: S): this is `${S}${string}`; endsWith(searchString: S): this is `${string}${S}`; includes( searchString: S, position?: number, ): this is `${string}${S}${string}`; } type LiteralUnionLike = T extends string ? T extends "" ? T : T extends `${T}${T}` ? never : T : T extends number ? `${T}0` extends `${number}` ? T : never : T extends null | undefined ? T : never; interface Array { includes( searchElement: T extends LiteralUnionLike ? unknown : never, fromIndex?: number, ): searchElement is T extends LiteralUnionLike ? T : never; } interface ReadonlyArray { includes( searchElement: T extends LiteralUnionLike ? unknown : never, fromIndex?: number, ): searchElement is T extends LiteralUnionLike ? T : never; }