typescript - Typbegränsning av objekt egenskaper med en funktion
Jag har en komplicerad typ med många inbäddade egenskaper. Jag vill typbegränsa. Detta verkar fungera för grundläggande primitiva typer, men när ett objekt är inblandat verkar TS inte kunna begränsa egenskaperna på samma sätt.
type Test = {
property: string | null
}
const propIsNotNull = (data: Test): boolean => {
return (data.property !== null)
}
const testData: Test = {
property: 'nonull'
}
if (propIsNotNull(testData)) {
console.log(testData.property.toUpperCase())
// ~~~~~~~~~~~~~~~~~
// 'testData.property' is possibly 'null'.(18047)
}
Jag kan givetvis ändra det till följande, men det gör koden svårare att läsa
if (testData.property !== null) {
console.log(testData.property.toUpperCase())
}
Jag vill egentligen inte skapa en ny typ bara för att jag ska kunna använda en typkontroll. Jag känner att jag missar något grundläggande enkelt.
Svar #1
En funktion utan en typ-predikat kommer aldrig att ha några inskränkningsmöjligheter. Du behöver heller inte en ny typ bara för att skapa en typ-predikat. Det finns flera sätt att återanvända typen och bara modifiera den del som du kontrollerar.
Ett möjligt sätt skulle se ut så här:
const propIsNotNull = (data: Test): data is Test & {
property: Exclude<Test["property"], null>
} => {
return (data.property !== null)
}
Typ-predikatet signalerar till anroparen att data är av typen Test och att egenskapen property inte är null om villkoret är true.
Lekplats
