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).
