diff --git a/numba/typed/listobject.py b/numba/typed/listobject.py
index 4f4071e51..0416a615d 100644
--- a/numba/typed/listobject.py
+++ b/numba/typed/listobject.py
@@ -12,6 +12,7 @@ from numba import _helperlib
 from numba.core.extending import (
     overload,
     overload_method,
+    overload_attribute,
     register_jitable,
     intrinsic,
     register_model,
@@ -1246,6 +1247,18 @@ def ol_list_sort(lst, key=None, reverse=False):
     return impl
 
 
+@overload_attribute(types.ListType, '_dtype')
+def impl_dtype(l):
+    if not isinstance(l, types.ListType):
+        return
+    dt = l.dtype
+
+    def impl(l):
+        return dt
+
+    return impl
+
+
 def _equals_helper(this, other, OP):
     if not isinstance(this, types.ListType):
         return
diff --git a/numba/typed/typedlist.py b/numba/typed/typedlist.py
index 0b0f73d6d..f2334c9f2 100644
--- a/numba/typed/typedlist.py
+++ b/numba/typed/typedlist.py
@@ -235,6 +235,12 @@ class List(MutableSequence):
         """
         return self._list_type is not None
 
+    @property
+    def _dtype(self):
+        if not self._typed:
+            raise RuntimeError("invalid operation on untyped list")
+        return self._list_type.dtype
+
     def _initialise_list(self, item):
         lsttype = types.ListType(typeof(item))
         self._list_type, self._opaque = self._parse_arg(lsttype)

Add `dtype` property to `List` class
<!--

Thanks for opening an issue! To help the Numba team handle your information
efficiently, please first ensure that there is no other issue present that
already describes the issue you have
(search at https://github.com/numba/numba/issues?&q=is%3Aissue).

For more general "how do I do X?" type questions, please speak to us in real
time on https://gitter.im/numba/numba or post to the Numba mailing list
https://groups.google.com/a/continuum.io/forum/#!forum/numba-users.

-->

## Feature request

<!--

Please include details of the feature you would like to see, why you would
like to see it/the use case

-->

add a `dtype` property to the `List` class that forwards to the `dtype` of the contained `_list_type`

Expected functionality:
```python
>>> from numba.typed import List
>>> a = List()
>>> a.append(3)
>>> a.dtype
'int64'
```

diff --git a/numba/tests/test_typedlist.py b/numba/tests/test_typedlist.py
index 9f26b1327..ee6738dd0 100644
--- a/numba/tests/test_typedlist.py
+++ b/numba/tests/test_typedlist.py
@@ -155,6 +155,34 @@ class TestTypedList(MemoryLeakMixin, TestCase):
         self.assertEqual(L.pop(ui32_1), 2)
         self.assertEqual(L.pop(ui32_0), 123)
 
+    def test_dtype(self):
+
+        L = List.empty_list(int32)
+        self.assertEqual(L._dtype, int32)
+
+        L = List.empty_list(float32)
+        self.assertEqual(L._dtype, float32)
+
+        @njit
+        def foo():
+            li, lf = List(), List()
+            li.append(int32(1))
+            lf.append(float32(1.0))
+            return li._dtype, lf._dtype
+
+        self.assertEqual(foo(), (np.dtype('int32'), np.dtype('float32')))
+        self.assertEqual(foo.py_func(), (int32, float32))
+
+    def test_dtype_raises_exception_on_untyped_list(self):
+
+        with self.assertRaises(RuntimeError) as raises:
+            L = List()
+            L._dtype
+        self.assertIn(
+            "invalid operation on untyped list",
+            str(raises.exception),
+        )
+
     @skip_parfors_unsupported
     def test_unsigned_prange(self):
         @njit(parallel=True)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc g++
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
exceptiongroup==1.2.2
importlib-metadata==6.7.0
iniconfig==2.0.0
llvmlite==0.31.0
-e git+https://github.com/numba/numba.git@0f2f216484209c283108a31ebc57db4962ca6930#egg=numba
numpy==1.21.6
packaging==24.0
pluggy==1.2.0
pytest==7.4.4
tomli==2.0.1
typing_extensions==4.7.1
zipp==3.15.0

name: numba
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argparse==1.4.0
      - exceptiongroup==1.2.2
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - llvmlite==0.31.0
      - numpy==1.21.6
      - packaging==24.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - zipp==3.15.0
prefix: /opt/conda/envs/numba

numba/tests/test_typedlist.py::TestTypedList::test_dtype numba/tests/test_typedlist.py::TestTypedList::test_dtype_raises_exception_on_untyped_list
numba/tests/test_typedlist.py::TestTypedList::test_basic numba/tests/test_typedlist.py::TestTypedList::test_catch_global_typed_list numba/tests/test_typedlist.py::TestTypedList::test_compiled numba/tests/test_typedlist.py::TestTypedList::test_delitem_slice numba/tests/test_typedlist.py::TestTypedList::test_getitem_slice numba/tests/test_typedlist.py::TestTypedList::test_list_create_no_jit_using_List numba/tests/test_typedlist.py::TestTypedList::test_list_create_no_jit_using_empty_list numba/tests/test_typedlist.py::TestTypedList::test_setitem_slice numba/tests/test_typedlist.py::TestTypedList::test_setitem_slice_value_error numba/tests/test_typedlist.py::TestTypedList::test_unsigned_access numba/tests/test_typedlist.py::TestTypedList::test_unsigned_prange numba/tests/test_typedlist.py::TestNoneType::test_append_none numba/tests/test_typedlist.py::TestNoneType::test_equals_none numba/tests/test_typedlist.py::TestNoneType::test_getitem_none numba/tests/test_typedlist.py::TestNoneType::test_iter_none numba/tests/test_typedlist.py::TestNoneType::test_len_none numba/tests/test_typedlist.py::TestNoneType::test_none_typed_method_fails numba/tests/test_typedlist.py::TestNoneType::test_not_equals_none numba/tests/test_typedlist.py::TestNoneType::test_setitem_none numba/tests/test_typedlist.py::TestAllocation::test_allocation numba/tests/test_typedlist.py::TestAllocation::test_growth_and_shrinkage numba/tests/test_typedlist.py::TestExtend::test_extend_other numba/tests/test_typedlist.py::TestExtend::test_extend_self numba/tests/test_typedlist.py::TestExtend::test_extend_tuple numba/tests/test_typedlist.py::TestComparisons::test_empty_vs_empty numba/tests/test_typedlist.py::TestComparisons::test_empty_vs_singleton numba/tests/test_typedlist.py::TestComparisons::test_equal numba/tests/test_typedlist.py::TestComparisons::test_equals_non_list numba/tests/test_typedlist.py::TestComparisons::test_first_greater_than numba/tests/test_typedlist.py::TestComparisons::test_first_less_than numba/tests/test_typedlist.py::TestComparisons::test_first_shorter numba/tests/test_typedlist.py::TestComparisons::test_second_shorter numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_empty numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_equal numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_greater_than numba/tests/test_typedlist.py::TestComparisons::test_singleton_vs_singleton_less_than numba/tests/test_typedlist.py::TestListInferred::test_refine_extend_list numba/tests/test_typedlist.py::TestListInferred::test_refine_extend_set numba/tests/test_typedlist.py::TestListInferred::test_refine_list_extend_iter numba/tests/test_typedlist.py::TestListInferred::test_simple_refine_append numba/tests/test_typedlist.py::TestListInferred::test_simple_refine_insert numba/tests/test_typedlist.py::TestListRefctTypes::test_array_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_dict_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_dict_as_item_in_list_multi_refcount numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_equal_lists numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_unequal_dicts numba/tests/test_typedlist.py::TestListRefctTypes::test_equals_on_list_with_dict_for_unequal_lists numba/tests/test_typedlist.py::TestListRefctTypes::test_jitclass_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_list_as_item_in_list numba/tests/test_typedlist.py::TestListRefctTypes::test_list_as_value_in_dict numba/tests/test_typedlist.py::TestListRefctTypes::test_storage_model_mismatch numba/tests/test_typedlist.py::TestListRefctTypes::test_str_item numba/tests/test_typedlist.py::TestListRefctTypes::test_str_item_refcount_replace numba/tests/test_typedlist.py::TestListSort::test_sort_all_args numba/tests/test_typedlist.py::TestListSort::test_sort_dispatcher_key numba/tests/test_typedlist.py::TestListSort::test_sort_in_jit_w_global_key numba/tests/test_typedlist.py::TestListSort::test_sort_in_jit_w_lambda_key numba/tests/test_typedlist.py::TestListSort::test_sort_no_args numba/tests/test_typedlist.py::TestListSort::test_sort_on_arrays numba/tests/test_typedlist.py::TestImmutable::test_append_fails numba/tests/test_typedlist.py::TestImmutable::test_getitem_still_works_when_immutable numba/tests/test_typedlist.py::TestImmutable::test_is_immutable numba/tests/test_typedlist.py::TestImmutable::test_length_still_works_when_immutable numba/tests/test_typedlist.py::TestImmutable::test_make_immutable_is_immutable numba/tests/test_typedlist.py::TestImmutable::test_mutation_fails
numba/typed/typedlist.py numba/typed/listobject.py
numba/typed/typedlist.py numba/typed/listobject.py