Typescript typuteslutning?


Jag känner till typunion & typintersektion i TypeScript men jag kunde inte hitta någon syntax eller lösning för att använda typuteslutning. Finns det ett sätt att göra det?

type ValidIndices = string ^ '_reservedProperty'; // All strings but '_reservedProperty'
interface MyInterface {
    [property: ValidIndices]: number;
    _reservedProperty: any;
}

Svar #1

Det är inte ett fullständigt svar. Men om du vill ställa in undantag för konstruktörsparametrar kan du använda kod som denna:

declare type Params<T, K extends keyof T = never, D extends keyof T = never> = (
  {[P in K]: T[P]} &
  {[P in keyof T]?: T[P]} &
  {[P in D]?: undefined }
)
...
class Control{
  prop1: number
  prop2: number
  prop3: number
  prop4: number

  constructor(params: Params<Control, 'prop1' | 'prop2', 'prop4'>){
    Object.assign(this, params)
...

Och du får:

params: {
  prop1: number
  prop2: number
  prop3?: number
  prop4?: undefined
}

Svar #2

Om det finns en begränsad uppsättning strängvärden som är tillåtna, kan du använda strängliteral för att definiera dem i typen

type ValidIndices = "a" | "b" | "c" ...

Jag tror dock inte att den funktionalitet som du letar efter finns just nu som en del av en typdefinition.

Du kan självklart uppnå detta genom kod i din implementering av MyInterface för att säkerställa att de olagliga värdena inte används. Men du kan inte göra det till en del av själva typdefinitionen (förutom strängliteraler, vilket du förmodligen inte vill).

Relaterade artiklar