TechBlog
首页分类标签搜索关于

© 2025 TechBlog. All rights reserved.

Typescript未知类型如何处理

12/22/2025
未分类#Typescript#Linux#Javascript

微信小程序星海飞驰

【Typescript】未知类型如何处理?

The error happens because Prisma’s Json type is a union of all valid JSON types: string | number | boolean | null | JsonObject | JsonArray.

TypeScript is complaining because a string or a number does not have a property named low_number. Even though you know user.data is likely an object, TypeScript must account for the possibility that it might be a primitive value.

Here are the three best ways to fix this:

1. The Cleanest Way (Type Assertion)

If you are confident that data is an object (or null), you can cast it to a custom interface or any. This is the most common approach for Prisma JSON fields.

// Define what your JSON looks like
interface UserData {
  low_number?: number;
}

const low_number = (user.data as UserData)?.low_number ?? -1;

2. Using Prisma’s JsonObject type

If you don’t want to create a custom interface, you can cast it to Prisma’s built-in JsonObject type. You must import it from @prisma/client.

import { Prisma } from '@prisma/client';

// ...

const data = user.data as Prisma.JsonObject;
const low_number = data?.low_number ?? -1;

3. The “Quick and Dirty” Way

If you don’t care about strict typing for this specific variable, cast it to any.

const low_number = (user.data as any)?.low_number ?? -1;

4. The Safest Way (Type Guard)

If you want to be 100% safe at runtime to ensure the code doesn’t crash if the JSON is malformed (e.g., it’s actually a string), check the type:

let low_number = -1;

if (user.data && typeof user.data === 'object' && !Array.isArray(user.data)) {
  const data = user.data as Record<string, any>;
  low_number = data.low_number ?? -1;
}

Why your original code failed:

// This fails because even if user.data is truthy, 
// it might be the string "hello", and "hello".low_number is invalid.
user.data && user.data.low_number 

Recommendation: Use Option 1. Defining an interface makes your code much more maintainable as your data field grows with more properties.

微信小程序星海飞驰